| //@ run-pass |
| use std::ops::Add; |
| |
| struct S<T, U = u16> { |
| a: T, |
| b: U, |
| } |
| |
| trait Tr { |
| fn f(&self) -> Self; |
| } |
| |
| impl<T: Default + Add<u8, Output = T>, U: Default> Tr for S<T, U> { |
| fn f(&self) -> Self { |
| let s = Self { a: Default::default(), b: Default::default() }; |
| match s { |
| Self { a, b } => Self { a: a + 1, b: b } |
| } |
| } |
| } |
| |
| impl<T: Default, U: Default + Add<u16, Output = U>> S<T, U> { |
| fn g(&self) -> Self { |
| let s = Self { a: Default::default(), b: Default::default() }; |
| match s { |
| Self { a, b } => Self { a: a, b: b + 1 } |
| } |
| } |
| } |
| |
| impl S<u8> { |
| fn new() -> Self { |
| Self { a: 0, b: 1 } |
| } |
| } |
| |
| fn main() { |
| let s0 = S::new(); |
| let s1 = s0.f(); |
| assert_eq!(s1.a, 1); |
| assert_eq!(s1.b, 0); |
| let s2 = s0.g(); |
| assert_eq!(s2.a, 0); |
| assert_eq!(s2.b, 1); |
| } |