diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/ui/implied_bounds_in_impls.fixed | 29 | ||||
| -rw-r--r-- | tests/ui/implied_bounds_in_impls.rs | 29 | ||||
| -rw-r--r-- | tests/ui/implied_bounds_in_impls.stderr | 38 |
3 files changed, 95 insertions, 1 deletions
diff --git a/tests/ui/implied_bounds_in_impls.fixed b/tests/ui/implied_bounds_in_impls.fixed index fa117aaddcd..18f29e900c1 100644 --- a/tests/ui/implied_bounds_in_impls.fixed +++ b/tests/ui/implied_bounds_in_impls.fixed @@ -121,4 +121,33 @@ mod issue11435 { fn f3() -> impl Trait4<i8, X = i32, Y = i128> {} } +fn issue11880() { + trait X { + type T; + type U; + } + trait Y: X { + type T; + type V; + } + impl X for () { + type T = i32; + type U = String; + } + impl Y for () { + type T = u32; + type V = Vec<u8>; + } + + // Can't constrain `X::T` through `Y` + fn f() -> impl X<T = i32> + Y {} + fn f2() -> impl X<T = i32> + Y<T = u32> {} + + // X::T is never constrained in the first place, so it can be omitted + // and left unconstrained + fn f3() -> impl Y {} + fn f4() -> impl Y<T = u32> {} + fn f5() -> impl Y<T = u32, U = String> {} +} + fn main() {} diff --git a/tests/ui/implied_bounds_in_impls.rs b/tests/ui/implied_bounds_in_impls.rs index c96aac151a7..b7951e7dfba 100644 --- a/tests/ui/implied_bounds_in_impls.rs +++ b/tests/ui/implied_bounds_in_impls.rs @@ -121,4 +121,33 @@ mod issue11435 { fn f3() -> impl Trait3<i8, i16, i64, X = i32, Y = i128> + Trait4<i8, X = i32> {} } +fn issue11880() { + trait X { + type T; + type U; + } + trait Y: X { + type T; + type V; + } + impl X for () { + type T = i32; + type U = String; + } + impl Y for () { + type T = u32; + type V = Vec<u8>; + } + + // Can't constrain `X::T` through `Y` + fn f() -> impl X<T = i32> + Y {} + fn f2() -> impl X<T = i32> + Y<T = u32> {} + + // X::T is never constrained in the first place, so it can be omitted + // and left unconstrained + fn f3() -> impl X + Y {} + fn f4() -> impl X + Y<T = u32> {} + fn f5() -> impl X<U = String> + Y<T = u32> {} +} + fn main() {} diff --git a/tests/ui/implied_bounds_in_impls.stderr b/tests/ui/implied_bounds_in_impls.stderr index fb44f2aba17..3b09e4582e3 100644 --- a/tests/ui/implied_bounds_in_impls.stderr +++ b/tests/ui/implied_bounds_in_impls.stderr @@ -192,5 +192,41 @@ LL - fn f3() -> impl Trait3<i8, i16, i64, X = i32, Y = i128> + Trait4<i8, X LL + fn f3() -> impl Trait4<i8, X = i32, Y = i128> {} | -error: aborting due to 16 previous errors +error: this bound is already specified as the supertrait of `Y` + --> $DIR/implied_bounds_in_impls.rs:148:21 + | +LL | fn f3() -> impl X + Y {} + | ^ + | +help: try removing this bound + | +LL - fn f3() -> impl X + Y {} +LL + fn f3() -> impl Y {} + | + +error: this bound is already specified as the supertrait of `Y<T = u32>` + --> $DIR/implied_bounds_in_impls.rs:149:21 + | +LL | fn f4() -> impl X + Y<T = u32> {} + | ^ + | +help: try removing this bound + | +LL - fn f4() -> impl X + Y<T = u32> {} +LL + fn f4() -> impl Y<T = u32> {} + | + +error: this bound is already specified as the supertrait of `Y<T = u32>` + --> $DIR/implied_bounds_in_impls.rs:150:21 + | +LL | fn f5() -> impl X<U = String> + Y<T = u32> {} + | ^^^^^^^^^^^^^ + | +help: try removing this bound + | +LL - fn f5() -> impl X<U = String> + Y<T = u32> {} +LL + fn f5() -> impl Y<T = u32, U = String> {} + | + +error: aborting due to 19 previous errors |
