Allow using generic trait methods in const fn by jonas-schievink · Pull Request #79287 · rust-lang/rust (original) (raw)

Next step for #67792, this now also allows code like the following:

struct S;

impl const PartialEq for S { fn eq(&self, _: &S) -> bool { true } }

const fn equals_self<T: PartialEq>(t: &T) -> bool { *t == *t }

pub const EQ: bool = equals_self(&S);

This works by threading const-ness of trait predicates through trait selection, in particular through ParamCandidate, and exposing it in the resulting ImplSource.

Since this change makes two bounds T: Trait and T: ?const Trait that only differ in their const-ness be treated like different bounds, candidate winnowing has been changed to drop the ?const candidate in favor of the const candidate, to avoid ambiguities when both a const and a non-const bound is present.