diff options
Diffstat (limited to 'tests')
4 files changed, 29 insertions, 31 deletions
diff --git a/tests/ui/impl-trait/trait_upcasting.rs b/tests/ui/impl-trait/trait_upcasting.rs index cb3c17e87b4..ce811004fae 100644 --- a/tests/ui/impl-trait/trait_upcasting.rs +++ b/tests/ui/impl-trait/trait_upcasting.rs @@ -1,5 +1,7 @@ //! Test that we allow unsizing `Trait<Concrete>` to `Trait<Opaque>` and vice versa +//@ check-pass + trait Trait<T> {} impl<T, U> Trait<T> for U {} @@ -8,7 +10,6 @@ fn hello() -> &'static (dyn Trait<impl Sized> + Send) { if false { let x = hello(); let _: &'static dyn Trait<()> = x; - //~^ ERROR: mismatched types } todo!() } @@ -18,7 +19,6 @@ fn bye() -> &'static dyn Trait<impl Sized> { let mut x = bye(); let y: &'static (dyn Trait<()> + Send) = &(); x = y; - //~^ ERROR: mismatched types } todo!() } diff --git a/tests/ui/impl-trait/trait_upcasting.stderr b/tests/ui/impl-trait/trait_upcasting.stderr deleted file mode 100644 index 2c1aa4bbf80..00000000000 --- a/tests/ui/impl-trait/trait_upcasting.stderr +++ /dev/null @@ -1,29 +0,0 @@ -error[E0308]: mismatched types - --> $DIR/trait_upcasting.rs:10:41 - | -LL | fn hello() -> &'static (dyn Trait<impl Sized> + Send) { - | ---------- the found opaque type -... -LL | let _: &'static dyn Trait<()> = x; - | ---------------------- ^ expected trait `Trait<()>`, found trait `Trait<impl Sized> + Send` - | | - | expected due to this - | - = note: expected reference `&'static (dyn Trait<()> + 'static)` - found reference `&dyn Trait<impl Sized> + Send` - -error[E0308]: mismatched types - --> $DIR/trait_upcasting.rs:20:13 - | -LL | fn bye() -> &'static dyn Trait<impl Sized> { - | ---------- the expected opaque type -... -LL | x = y; - | ^ expected trait `Trait<impl Sized>`, found trait `Trait<()> + Send` - | - = note: expected reference `&dyn Trait<impl Sized>` - found reference `&'static (dyn Trait<()> + Send + 'static)` - -error: aborting due to 2 previous errors - -For more information about this error, try `rustc --explain E0308`. diff --git a/tests/ui/impl-trait/trait_upcasting_reference_mismatch.rs b/tests/ui/impl-trait/trait_upcasting_reference_mismatch.rs new file mode 100644 index 00000000000..bed88db1acc --- /dev/null +++ b/tests/ui/impl-trait/trait_upcasting_reference_mismatch.rs @@ -0,0 +1,18 @@ +//! Show an uninformative diagnostic that we could possibly improve in the future + +trait Trait<T> {} + +impl<T, U> Trait<T> for U {} + +fn hello() -> &'static (dyn Trait<impl Sized> + Send) { + //~^ ERROR: type annotations needed + if false { + let x = hello(); + let _: &'static dyn Trait<()> = &x; + //^ Note the extra `&`, paired with the blanket impl causing + // `impl Sized` to never get a hidden type registered. + } + todo!() +} + +fn main() {} diff --git a/tests/ui/impl-trait/trait_upcasting_reference_mismatch.stderr b/tests/ui/impl-trait/trait_upcasting_reference_mismatch.stderr new file mode 100644 index 00000000000..92da47b08e9 --- /dev/null +++ b/tests/ui/impl-trait/trait_upcasting_reference_mismatch.stderr @@ -0,0 +1,9 @@ +error[E0282]: type annotations needed + --> $DIR/trait_upcasting_reference_mismatch.rs:7:35 + | +LL | fn hello() -> &'static (dyn Trait<impl Sized> + Send) { + | ^^^^^^^^^^ cannot infer type + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0282`. |
