// run-pass #![allow(dead_code)] #![allow(unused_variables)] #![allow(stable_features)] // Test that we handle projection types which wind up important for // resolving methods. This test was reduced from a larger example; the // call to `foo()` at the end was failing to resolve because the // winnowing stage of method resolution failed to handle an associated // type projection. // pretty-expanded FIXME #23616 #![feature(associated_types)] trait Hasher { type Output; fn finish(&self) -> Self::Output; } trait Hash { fn hash(&self, h: &mut H); } trait HashState { type Wut: Hasher; fn hasher(&self) -> Self::Wut; } struct SipHasher; impl Hasher for SipHasher { type Output = u64; fn finish(&self) -> u64 { 4 } } impl Hash for isize { fn hash(&self, h: &mut SipHasher) {} } struct SipState; impl HashState for SipState { type Wut = SipHasher; fn hasher(&self) -> SipHasher { SipHasher } } struct Map { s: S, } impl Map where S: HashState, ::Wut: Hasher, { fn foo(&self, k: K) where K: Hash< ::Wut> {} } fn foo>(map: &Map) { map.foo(22); } fn main() {}