8f5b5f94dc
This is an implementation of [RFC 1030][rfc] which adds these traits to the prelude and additionally removes all inherent `into_iter` methods on collections in favor of the trait implementation (which is now accessible by default). [rfc]: https://github.com/rust-lang/rfcs/pull/1030 This is technically a breaking change due to the prelude additions and removal of inherent methods, but it is expected that essentially no code breaks in practice. [breaking-change] Closes #24538
65 lines
1.8 KiB
Rust
65 lines
1.8 KiB
Rust
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
// 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() {}
|