about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaybe Waffle <waffle.lapkin@gmail.com>2024-01-22 17:21:57 +0000
committerMaybe Lapkin <waffle.lapkin@gmail.com>2024-07-04 17:56:08 +0200
commit36b1f4411db4a35fbbeaec58f0603e4e086e851f (patch)
treeb062c9dd8975b8a54e55d8d14c18707908ad864a
parente2cf31a6148725bde4ea48acf1e4fe72675257a2 (diff)
downloadrust-36b1f4411db4a35fbbeaec58f0603e4e086e851f.tar.gz
rust-36b1f4411db4a35fbbeaec58f0603e4e086e851f.zip
Add a test for `*const Tr<A>` to `*const Tr<B>` casts
-rw-r--r--tests/ui/cast/ptr-to-trait-obj-different-args.rs30
-rw-r--r--tests/ui/cast/ptr-to-trait-obj-different-args.stderr11
2 files changed, 41 insertions, 0 deletions
diff --git a/tests/ui/cast/ptr-to-trait-obj-different-args.rs b/tests/ui/cast/ptr-to-trait-obj-different-args.rs
new file mode 100644
index 00000000000..2cb661ba016
--- /dev/null
+++ b/tests/ui/cast/ptr-to-trait-obj-different-args.rs
@@ -0,0 +1,30 @@
+// check-fail
+//
+// issue: <https://github.com/rust-lang/rust/issues/120222>
+
+
+trait A {}
+impl<T> A for T {}
+trait B {}
+impl<T> B for T {}
+
+trait Trait<G> {}
+struct X;
+impl<T> Trait<X> for T {}
+struct Y;
+impl<T> Trait<Y> for T {}
+
+fn main() {
+    let a: *const dyn A = &();
+    let b: *const dyn B = a as _; //~ error: casting `*const dyn A` as `*const dyn B` is invalid
+
+    let x: *const dyn Trait<X> = &();
+    let y: *const dyn Trait<Y> = x as _;
+
+    _ = (b, y);
+}
+
+fn generic<T>(x: *const dyn Trait<X>, t: *const dyn Trait<T>) {
+    let _: *const dyn Trait<T> = x as _;
+    let _: *const dyn Trait<X> = t as _;
+}
diff --git a/tests/ui/cast/ptr-to-trait-obj-different-args.stderr b/tests/ui/cast/ptr-to-trait-obj-different-args.stderr
new file mode 100644
index 00000000000..14e8a48ffd9
--- /dev/null
+++ b/tests/ui/cast/ptr-to-trait-obj-different-args.stderr
@@ -0,0 +1,11 @@
+error[E0606]: casting `*const dyn A` as `*const dyn B` is invalid
+  --> $DIR/ptr-to-trait-obj-different-args.rs:19:27
+   |
+LL |     let b: *const dyn B = a as _;
+   |                           ^^^^^^
+   |
+   = note: vtable kinds may not match
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0606`.