forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
"simple type inference fails depending on order of trait bounds"
- Loading branch information
Julian Wollersberger
committed
Nov 28, 2020
1 parent
4ae328b
commit 1fa4325
Showing
1 changed file
with
47 additions
and
0 deletions.
There are no files selected for viewing
47 changes: 47 additions & 0 deletions
47
src/test/ui/associated-type-bounds/order-dependent-bounds-issue-54121.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() { } |