diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-11-18 14:13:35 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-18 14:13:35 +0100 |
| commit | 741f3cf38331d4644b89d52f54c2683c17f54670 (patch) | |
| tree | 80abe20c55ac268dbbbffd53391bf7c4f87f078e /src | |
| parent | 3e5965722ca46b82cc68cb1acdddf7e187a6ee02 (diff) | |
| parent | 4f978dbaf91e7029792dd1f7e14a851ee040aabb (diff) | |
Rollup merge of #103386 - compiler-errors:no-coerceunsized-to-dynstar, r=eholk
Don't allow `CoerceUnsized` into `dyn*` (except for trait upcasting) This makes sure we don't accidentally allow coercions like `Box<T>` -> `Box<dyn* Trait>`, or in the case of this ICE, `&T` to `&dyn* Trait`. These coercions don't make sense, at least not via the `CoerceUnsized` trait. Fixes #102172 Fixes #102429
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/dyn-star/dont-unsize-coerce-dyn-star.rs | 26 | ||||
| -rw-r--r-- | src/test/ui/dyn-star/unsize-into-ref-dyn-star.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/dyn-star/unsize-into-ref-dyn-star.stderr | 9 |
3 files changed, 44 insertions, 0 deletions
diff --git a/src/test/ui/dyn-star/dont-unsize-coerce-dyn-star.rs b/src/test/ui/dyn-star/dont-unsize-coerce-dyn-star.rs new file mode 100644 index 00000000000..b4ff8a22286 --- /dev/null +++ b/src/test/ui/dyn-star/dont-unsize-coerce-dyn-star.rs @@ -0,0 +1,26 @@ +// check-pass + +#![feature(dyn_star)] +#![allow(incomplete_features)] + +trait AddOne { + fn add1(&mut self) -> usize; +} + +impl AddOne for usize { + fn add1(&mut self) -> usize { + *self += 1; + *self + } +} + +fn add_one(i: &mut (dyn* AddOne + '_)) -> usize { + i.add1() +} + +fn main() { + let mut x = 42usize as dyn* AddOne; + + println!("{}", add_one(&mut x)); + println!("{}", add_one(&mut x)); +} diff --git a/src/test/ui/dyn-star/unsize-into-ref-dyn-star.rs b/src/test/ui/dyn-star/unsize-into-ref-dyn-star.rs new file mode 100644 index 00000000000..1e8cafe1561 --- /dev/null +++ b/src/test/ui/dyn-star/unsize-into-ref-dyn-star.rs @@ -0,0 +1,9 @@ +#![feature(dyn_star)] +#![allow(incomplete_features)] + +use std::fmt::Debug; + +fn main() { + let i = 42 as &dyn* Debug; + //~^ ERROR non-primitive cast: `i32` as `&dyn* Debug` +} diff --git a/src/test/ui/dyn-star/unsize-into-ref-dyn-star.stderr b/src/test/ui/dyn-star/unsize-into-ref-dyn-star.stderr new file mode 100644 index 00000000000..f6444a60a46 --- /dev/null +++ b/src/test/ui/dyn-star/unsize-into-ref-dyn-star.stderr @@ -0,0 +1,9 @@ +error[E0605]: non-primitive cast: `i32` as `&dyn* Debug` + --> $DIR/unsize-into-ref-dyn-star.rs:7:13 + | +LL | let i = 42 as &dyn* Debug; + | ^^^^^^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0605`. |
