//@ check-pass //@ compile-flags: -Znext-solver use std::ops::Deref; pub struct List { skel: [T], } impl<'a, T: Copy> IntoIterator for &'a List { type Item = T; type IntoIter = std::iter::Copied<<&'a [T] as IntoIterator>::IntoIter>; fn into_iter(self) -> Self::IntoIter { todo!() } } impl Deref for List { type Target = [T]; fn deref(&self) -> &[T] { todo!() } } impl List { fn iter(&self) -> <&Self as IntoIterator>::IntoIter where T: Copy, { todo!() } } fn test(t: &List) { // Checking that `<&List as IntoIterator>::IntoIter` is WF // will disqualify the inherent method, since normalizing it // requires `Q: Copy` which does not hold. and allow us to fall // through to the deref'd `<[Q]>::iter` method which works. // // In the old solver, the same behavior is achieved by just // eagerly normalizing the return type. t.iter(); } fn main() {}