// 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 + Tr` // But both should compile as order shouldn't matter. trait Tr { fn exec(a: A, b: B); } trait P { // This compiled successfully type T: Tr + Tr; } trait Q { // This didn't compile type T: Tr + Tr; } #[allow(dead_code)] fn f() { ::T::exec(0u8, 0u8) } #[allow(dead_code)] fn g() { // A mismatched types error was emitted on this line. ::T::exec(0u8, 0u8) } // Another reproduction of the same issue trait Trait { type Type: Into + Into + Copy; type Type1; type Type2; } #[allow(dead_code)] fn foo(x: T::Type) { let _1: T::Type1 = x.into(); let _2: T::Type2 = x.into(); } fn main() { }