]> git.lizzy.rs Git - rust.git/blob - src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs
Auto merge of #103600 - compiler-errors:early-binder-nits, r=spastorino
[rust.git] / src / test / ui / associated-type-bounds / order-dependent-bounds-issue-54121.rs
1 // check-pass
2
3 // From https://github.com/rust-lang/rust/issues/54121/
4 //
5 // Whether the code compiled depended on the order of the trait bounds in
6 // `type T: Tr<u8, u8> + Tr<u16, u16>`
7 // But both should compile as order shouldn't matter.
8
9 trait Tr<A, B> {
10     fn exec(a: A, b: B);
11 }
12
13 trait P {
14     // This compiled successfully
15     type T: Tr<u16, u16> + Tr<u8, u8>;
16 }
17
18 trait Q {
19     // This didn't compile
20     type T: Tr<u8, u8> + Tr<u16, u16>;
21 }
22
23 #[allow(dead_code)]
24 fn f<S: P>() {
25     <S as P>::T::exec(0u8, 0u8)
26 }
27
28 #[allow(dead_code)]
29 fn g<S: Q>() {
30     // A mismatched types error was emitted on this line.
31     <S as Q>::T::exec(0u8, 0u8)
32 }
33
34 // Another reproduction of the same issue
35 trait Trait {
36     type Type: Into<Self::Type1> + Into<Self::Type2> + Copy;
37     type Type1;
38     type Type2;
39 }
40
41 #[allow(dead_code)]
42 fn foo<T: Trait>(x: T::Type) {
43     let _1: T::Type1 = x.into();
44     let _2: T::Type2 = x.into();
45 }
46
47 fn main() { }