]> git.lizzy.rs Git - rust.git/blob - tests/ui/traits/trait-upcasting/correct-supertrait-substitution.rs
Auto merge of #106646 - Amanieu:ilp32-object, r=Mark-Simulacrum
[rust.git] / tests / ui / traits / trait-upcasting / correct-supertrait-substitution.rs
1 // run-pass
2 #![feature(trait_upcasting)]
3
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()
8     }
9 }
10
11 struct S1;
12
13 impl Bar<i32> for S1 {}
14 impl Foo<i32> for S1 {}
15
16 struct S2;
17 impl Bar<i32> for S2 {}
18 impl Bar<bool> for S2 {}
19 impl Foo<bool> for S2 {}
20
21 fn test1(x: &dyn Foo<i32>) {
22     let s = x as &dyn Bar<i32>;
23     assert_eq!("0", &s.bar().to_string());
24 }
25
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());
31 }
32
33 fn main() {
34     let s1 = S1;
35     test1(&s1);
36     let s2 = S2;
37     test2(&s2);
38 }