// build-pass (FIXME(62277): could be check-pass?) #![allow(dead_code)] // Regression test for issue #21245. Check that we are able to infer // the types in these examples correctly. It used to be that // insufficient type propagation caused the type of the iterator to be // incorrectly unified with the `*const` type to which it is coerced. // pretty-expanded FIXME #23616 use std::ptr; trait IntoIterator { type Iter: Iterator; fn into_iter2(self) -> Self::Iter; } impl IntoIterator for I where I: Iterator { type Iter = I; fn into_iter2(self) -> I { self } } fn desugared_for_loop_bad(v: Vec) { match IntoIterator::into_iter2(v.iter()) { mut iter => { loop { match ::std::iter::Iterator::next(&mut iter) { ::std::option::Option::Some(x) => { unsafe { ptr::read(x); } }, ::std::option::Option::None => break } } } } } fn desugared_for_loop_good(v: Vec) { match v.iter().into_iter() { mut iter => { loop { match ::std::iter::Iterator::next(&mut iter) { ::std::option::Option::Some(x) => { unsafe { ptr::read(x); } }, ::std::option::Option::None => break } } } } } fn main() {}