diff --git a/tests/ui/impl-trait/trait_upcasting.rs b/tests/ui/impl-trait/trait_upcasting.rs new file mode 100644 index 00000000000..cb3c17e87b4 --- /dev/null +++ b/tests/ui/impl-trait/trait_upcasting.rs @@ -0,0 +1,26 @@ +//! Test that we allow unsizing `Trait` to `Trait` and vice versa + +trait Trait {} + +impl Trait for U {} + +fn hello() -> &'static (dyn Trait + Send) { + if false { + let x = hello(); + let _: &'static dyn Trait<()> = x; + //~^ ERROR: mismatched types + } + todo!() +} + +fn bye() -> &'static dyn Trait { + if false { + let mut x = bye(); + let y: &'static (dyn Trait<()> + Send) = &(); + x = y; + //~^ ERROR: mismatched types + } + todo!() +} + +fn main() {} diff --git a/tests/ui/impl-trait/trait_upcasting.stderr b/tests/ui/impl-trait/trait_upcasting.stderr new file mode 100644 index 00000000000..2c1aa4bbf80 --- /dev/null +++ b/tests/ui/impl-trait/trait_upcasting.stderr @@ -0,0 +1,29 @@ +error[E0308]: mismatched types + --> $DIR/trait_upcasting.rs:10:41 + | +LL | fn hello() -> &'static (dyn Trait + Send) { + | ---------- the found opaque type +... +LL | let _: &'static dyn Trait<()> = x; + | ---------------------- ^ expected trait `Trait<()>`, found trait `Trait + Send` + | | + | expected due to this + | + = note: expected reference `&'static (dyn Trait<()> + 'static)` + found reference `&dyn Trait + Send` + +error[E0308]: mismatched types + --> $DIR/trait_upcasting.rs:20:13 + | +LL | fn bye() -> &'static dyn Trait { + | ---------- the expected opaque type +... +LL | x = y; + | ^ expected trait `Trait`, found trait `Trait<()> + Send` + | + = note: expected reference `&dyn Trait` + found reference `&'static (dyn Trait<()> + Send + 'static)` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0308`.