// run-pass #![allow(unused_imports)] // Test for an ICE that occurred when a default method implementation // was applied to a type that did not meet the prerequisites. The // problem occurred specifically because normalizing // `Self::Item::Target` was impossible in this case. use std::boxed::Box; use std::marker::Sized; use std::clone::Clone; use std::ops::Deref; use std::option::Option; use std::option::Option::{Some,None}; trait Iterator { type Item; fn next(&mut self) -> Option; fn clone_first(mut self) -> Option<::Target> where Self: Sized, Self::Item: Deref, ::Target: Clone, { self.next().map(|x| x.clone()) } } struct Counter { value: i32 } struct Token { value: i32 } impl Iterator for Counter { type Item = Token; fn next(&mut self) -> Option { let x = self.value; self.value += 1; Some(Token { value: x }) } } fn main() { let mut x: Box> = Box::new(Counter { value: 22 }); assert_eq!(x.next().unwrap().value, 22); }