summaryrefslogtreecommitdiffstats
path: root/src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs')
-rw-r--r--src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs b/src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs
new file mode 100644
index 000000000..77e4bd4d6
--- /dev/null
+++ b/src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs
@@ -0,0 +1,47 @@
+// check-pass
+
+// From https://github.com/rust-lang/rust/issues/54121/
+//
+// Whether the code compiled depended on the order of the trait bounds in
+// `type T: Tr<u8, u8> + Tr<u16, u16>`
+// But both should compile as order shouldn't matter.
+
+trait Tr<A, B> {
+ fn exec(a: A, b: B);
+}
+
+trait P {
+ // This compiled successfully
+ type T: Tr<u16, u16> + Tr<u8, u8>;
+}
+
+trait Q {
+ // This didn't compile
+ type T: Tr<u8, u8> + Tr<u16, u16>;
+}
+
+#[allow(dead_code)]
+fn f<S: P>() {
+ <S as P>::T::exec(0u8, 0u8)
+}
+
+#[allow(dead_code)]
+fn g<S: Q>() {
+ // A mismatched types error was emitted on this line.
+ <S as Q>::T::exec(0u8, 0u8)
+}
+
+// Another reproduction of the same issue
+trait Trait {
+ type Type: Into<Self::Type1> + Into<Self::Type2> + Copy;
+ type Type1;
+ type Type2;
+}
+
+#[allow(dead_code)]
+fn foo<T: Trait>(x: T::Type) {
+ let _1: T::Type1 = x.into();
+ let _2: T::Type2 = x.into();
+}
+
+fn main() { }