2 #![feature(trait_upcasting)]
4 trait Foo<T: Default + ToString>: Bar<i32> + Bar<T> {}
5 trait Bar<T: Default + ToString> {
6 fn bar(&self) -> String {
7 T::default().to_string()
13 impl Bar<i32> for S1 {}
14 impl Foo<i32> for S1 {}
17 impl Bar<i32> for S2 {}
18 impl Bar<bool> for S2 {}
19 impl Foo<bool> for S2 {}
21 fn test1(x: &dyn Foo<i32>) {
22 let s = x as &dyn Bar<i32>;
23 assert_eq!("0", &s.bar().to_string());
26 fn test2(x: &dyn Foo<bool>) {
27 let p = x as &dyn Bar<i32>;
28 assert_eq!("0", &p.bar().to_string());
29 let q = x as &dyn Bar<bool>;
30 assert_eq!("false", &q.bar().to_string());