mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-14 02:49:40 +00:00
48 lines
996 B
Rust
48 lines
996 B
Rust
//@ check-pass
|
|
//@ compile-flags: -Znext-solver
|
|
|
|
use std::ops::Deref;
|
|
|
|
pub struct List<T> {
|
|
skel: [T],
|
|
}
|
|
|
|
impl<'a, T: Copy> IntoIterator for &'a List<T> {
|
|
type Item = T;
|
|
type IntoIter = std::iter::Copied<<&'a [T] as IntoIterator>::IntoIter>;
|
|
|
|
fn into_iter(self) -> Self::IntoIter {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl<T> Deref for List<T> {
|
|
type Target = [T];
|
|
|
|
fn deref(&self) -> &[T] {
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
impl<T> List<T> {
|
|
fn iter(&self) -> <&Self as IntoIterator>::IntoIter
|
|
where
|
|
T: Copy,
|
|
{
|
|
todo!()
|
|
}
|
|
}
|
|
|
|
fn test<Q>(t: &List<Q>) {
|
|
// Checking that `<&List<Q> 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() {}
|