Change:
Found in () Errors: modify labels: T-compiler, C-bug, A-traits, A-dst, A-associated-items, A-typesystem and please add “I-unsound ”
cc - this looks like it might be related to some of your work.
Assigning as discussed as part of the and removing .
Without the keyword, the function type-checks since Rust 1.0.0. And a function like e.g. leads to reading a bunch of memory and segfaulting on every Rust version, as far as I can tell (at least in debug builds).
To me, this is the same root cause as : we unconditionally say that any type is well-formed and implements without checking the actual where clauses declared on the trait, so you can deduce contradictory things with the help of implied bounds (to be fair, already introduced some checks). Except that I was wrong in my saying that an easy fix for our current limited form of implied bounds would be to just check transitive lifetime requirements. Obviously, example shows that implied bounds for super traits play a role as well.

Discussion:
.predicates .into_iter() { <del> if let ty::PredicateKind::Trait(..) = super_trait.kind().skip_binder() { let normalized_super_trait = normalize_with_depth_to( self, obligation.param_env, obligation.cause.clone(), obligation.recursion_depth + 1, super_trait, &mut nested, ); nested.push(Obligation::new( obligation.cause.clone(), obligation.param_env, normalized_super_trait, )); } </del> <ins> let normalized_super_trait = normalize_with_depth_to( self, obligation.param_env, obligation.cause.clone(), obligation.recursion_depth + 1, super_trait, &mut nested, ); nested.push(Obligation::new( obligation.cause.clone(), obligation.param_env, normalized_super_trait, )); </ins> } let assoc_types: Vec<_> = tcx

<ins> trait SuperTrait { type A; type B; } trait Trait: SuperTrait<A = <Self as SuperTrait>::B> {} fn transmute<A, B>(x: A) -> B { foo::<A, B, dyn Trait<A = A, B = B>>(x) //~^ ERROR type mismatch resolving `<dyn Trait<A = A, B = B> as SuperTrait>::A == B` } fn foo<A, B, T: ?Sized>(x: T::A) -> B where T: Trait<B = B>, { x } static X: u8 = 0; fn main() { let x = transmute::<&u8, &[u8; 1_000_000]>(&X); println!("{:?}", x[100_000]); } </ins>

<ins> error[E0271]: type mismatch resolving `<dyn Trait<A = A, B = B> as SuperTrait>::A == B` --> $DIR/enforce-supertrait-projection.rs:9:5 | LL | fn transmute<A, B>(x: A) -> B { |              -  - expected type parameter |              | |              found type parameter LL |     foo::<A, B, dyn Trait<A = A, B = B>>(x) |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter `B`, found type parameter `A` | = note: expected type parameter `B` found type parameter `A` = note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters note: required by a bound in `foo` --> $DIR/enforce-supertrait-projection.rs:15:8 | LL | fn foo<A, B, T: ?Sized>(x: T::A) -> B |    --- required by a bound in this LL | where LL |     T: Trait<B = B>, |        ^^^^^^^^^^^^ required by this bound in `foo` error: aborting due to previous error For more information about this error, try `rustc --explain E0271`. </ins>

<ins> error: lifetime may not live long enough --> $DIR/supertrait-lifetime-bound.rs:10:5 | LL | fn test2<'a>() { |          -- lifetime `'a` defined here ... LL |     test1::<dyn Bar<&'a u32>, _>(); |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static` error: aborting due to previous error </ins>

<del> // check-pass </del> <ins> trait Foo: 'static { } </ins> <del> use std::any::Any; </del> <ins> trait Bar<T>: Foo { } </ins> <del> trait A<T>: Any { fn m(&self) {} } impl<S, T: 'static> A<S> for T {} </del> <ins> fn test1<T: ?Sized + Bar<S>, S>() { } </ins> <del> fn call_obj<'a>() { let obj: &dyn A<&'a ()> = &(); obj.m(); </del> <ins> fn test2<'a>() { // Here: the type `dyn Bar<&'a u32>` references `'a`, // and so it does not outlive `'static`. test1::<dyn Bar<&'a u32>, _>(); //~^ ERROR the type `(dyn Bar<&'a u32> + 'static)` does not fulfill the required lifetime </ins> } <del> fn main() {} </del> <ins> fn main() { } </ins>

<ins> error[E0477]: the type `(dyn Bar<&'a u32> + 'static)` does not fulfill the required lifetime --> $DIR/supertrait-lifetime-bound.rs:10:5 | LL |     test1::<dyn Bar<&'a u32>, _>(); |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: type must satisfy the static lifetime as required by this binding --> $DIR/supertrait-lifetime-bound.rs:5:22 | LL | fn test1<T: ?Sized + Bar<S>, S>() { } |                      ^^^^^^ error: aborting due to previous error For more information about this error, try `rustc --explain E0477`. </ins>