bounds on trait impls are used in implied bounds #109628
Open
Description
The following compiles although it shouldn't:
trait Trait {
type Assoc;
}
impl<T: 'static> Trait for Box<T> {
type Assoc = ();
}
struct MyTy<U>(U)
where
U: Trait,
U::Assoc: Sized, // any predicate naming U::Assoc
;
fn fn_test<T>(_: MyTy<Box<T>>) {}
fn_test
should fail with an error requiring an explicit T: 'static
bound.
This is a compiler bug for the following reasons:
- It certainly does not follow from the rules of RFC 1214 and RFC 2089. The implied bounds from a trait reference (
Box<T>: Trait
) includes only the where-clauses of the trait itself, not the trait impl. - It breaks stability guarantees in the sense that relaxing region constraints on trait impls is now a breaking change. Removing the useless bound
U::Assoc: Sized
is also a breaking change. - It requires remote reasoning when dealing with implied bounds.
- It is a surprising behavior: why does the trivial bound
U::Assoc: Sized
make any meaningful difference?