Remove manual WF hack by compiler-errors · Pull Request #140557 · rust-lang/rust (original) (raw)
We do not need this hack anymore since we fixed the candidate selection problems with Sized
bounds. We prefer built-in sized bounds now since #138176, which fixes the only regression this hack was intended to fix.
While this theoretically is broken for some code, for example, when there a param-env bound that shadows an impl or built-in trait, we don't see it in practice and IMO it's not worth the burden of having to maintain this wart in compare_method_predicate_entailment
.
The code that regresses is, for example:
trait Bar<'a> {}
trait Foo<'a, T> { fn method(&self) where Self: Bar<'a>; }
struct W<'a, T>(&'a T) where Self: Bar<'a>;
impl<'a, 'b, T> Bar<'a> for W<'b, T> {}
impl<'a, 'b, T> Foo<'a, T> for W<'b, T> { fn method(&self) {} }
Specifically, I don't believe this is really going to be encountered in practice. For this to fail, there must be a where clause in the trait method that would shadow an impl or built-in (non-Sized
) candidate in the trait, and this shadowing would need to be encountered when solving a nested WF goal from the impl self type.
See #108544 for the original regression. Crater run is clean!
r? lcnr