mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 11:48:30 +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() {}
|