57 lines
1.4 KiB
Rust
57 lines
1.4 KiB
Rust
// compile-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<I> IntoIterator for I where I: Iterator {
|
|
type Iter = I;
|
|
|
|
fn into_iter2(self) -> I {
|
|
self
|
|
}
|
|
}
|
|
|
|
fn desugared_for_loop_bad<T>(v: Vec<T>) {
|
|
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<T>(v: Vec<T>) {
|
|
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() {}
|