1 // run-pass 2 3 pub trait Stream { 4 type Item; 5 type Error; 6 } 7 8 pub trait ParseError<I> { 9 type Output; 10 } 11 12 impl ParseError<char> for u32 { 13 type Output = (); 14 } 15 16 impl Stream for () { 17 type Item = char; 18 type Error = u32; 19 } 20 21 pub struct Lex<'a, I> 22 where I: Stream, 23 I::Error: ParseError<char>, 24 <<I as Stream>::Error as ParseError<char>>::Output: 'a 25 { 26 x: &'a <I::Error as ParseError<char>>::Output 27 } 28 29 pub struct Reserved<'a, I> where 30 I: Stream<Item=char> + 'a, 31 I::Error: ParseError<I::Item>, 32 <<I as Stream>::Error as ParseError<char>>::Output: 'a 33 34 { 35 x: Lex<'a, I> 36 } 37 main()38fn main() { 39 let r: Reserved<()> = Reserved { 40 x: Lex { 41 x: &() 42 } 43 }; 44 45 let _v = r.x.x; 46 } 47