Change:
on the following code produces an ICE (just doesn’t ICE) () Possibly, this bug can also lead to unsoundness in some way. (I haven’t fully explored that [yet].) Notably, doesn’t come with the same problem: I would’ve expected a similar error message for the case as well. (Further, note that the way things currently stand, the type itself is . It’s only the call to which has an bound. The error also successfully appears if has a higher-ranked bound and/or is not actually called but just instantiated with the type argument, .) label requires-nightly, F-unboxedclosures, A-traits, A-typesystem, A-associated-items
Fixed by , different enough that marking as needs-test

Discussion:
<ins> // check-pass // edition:2018 type BoxFuture<T> = std::pin::Pin<Box<dyn std::future::Future<Output=T>>>; fn main() { f(); } async fn f() { run("dependency").await; } struct InMemoryStorage; struct User<'dep> { dep: &'dep str, } impl<'a> StorageRequest<InMemoryStorage> for SaveUser<'a> { fn execute(&self) -> BoxFuture<Result<(), String>> { todo!() } } trait Storage { type Error; } impl Storage for InMemoryStorage { type Error = String; } trait StorageRequestReturnType { type Output; } trait StorageRequest<S: Storage>: StorageRequestReturnType { fn execute( &self, ) -> BoxFuture<Result<<Self as StorageRequestReturnType>::Output, <S as Storage>::Error>>; } struct SaveUser<'a> { name: &'a str, } impl<'a> StorageRequestReturnType for SaveUser<'a> { type Output = (); } impl<'dep> User<'dep> { async fn save<S>(self) where S: Storage, for<'a> SaveUser<'a>: StorageRequest<S>, { SaveUser { name: "Joe" } .execute() .await; } } async fn run<S>(dep: &str) where S: Storage, for<'a> SaveUser<'a>: StorageRequest<S>, { User { dep }.save().await; } </ins>

<ins> // check-pass trait Bar { type Type; } struct Foo<'a>(&'a ()); impl<'a> Bar for Foo<'a> { type Type = (); } fn func<'a>(_: <Foo<'a> as Bar>::Type) {} fn assert_is_func<A>(_: fn(A)) {} fn test() where for<'a> <Foo<'a> as Bar>::Type: Sized, { assert_is_func(func); } fn main() {} </ins>

<ins> // check-pass pub trait Indexable { type Idx; } impl Indexable for u8 { type Idx = u8; } impl Indexable for u16 { type Idx = u16; } pub trait Indexer<T: Indexable>: std::ops::Index<T::Idx, Output = T> {} trait StoreIndex: Indexer<u8> + Indexer<u16> {} fn foo(st: &impl StoreIndex) -> &dyn StoreIndex { st as &dyn StoreIndex } fn main() {} </ins>

<ins> #![feature(unboxed_closures)] trait SomeTrait<'a> { type Associated; } fn give_me_ice<T>() { callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>(); //~^ ERROR: the trait bound `T: SomeTrait<'_>` is not satisfied } fn callee<T: Fn<(&'static (),)>>() { println!("{}", std::any::type_name::<<T as FnOnce<(&'static (),)>>::Output>()); } fn main() { give_me_ice::<()>(); } </ins>

<ins> error[E0277]: the trait bound `T: SomeTrait<'_>` is not satisfied --> $DIR/issue-85455.rs:8:5 | LL |     callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>(); |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `SomeTrait<'_>` is not implemented for `T` | help: consider restricting type parameter `T` | LL | fn give_me_ice<T: SomeTrait<'_>>() { |                 +++++++++++++++ error: aborting due to previous error For more information about this error, try `rustc --explain E0277`. </ins>