about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-11-05 13:48:30 +0000
committerbors <bors@rust-lang.org>2022-11-05 13:48:30 +0000
commit6b8d9dd0a09851b3e4f400ddd1303857945be25d (patch)
tree41c63f339061a02a324140c7be0ccca383c7f0a2 /src
parentb0f3940c35d565399dccf8c79f38147b40f2724a (diff)
parent749afe57c3e16667128c3e983166d7a69d03a3dd (diff)
downloadrust-6b8d9dd0a09851b3e4f400ddd1303857945be25d.tar.gz
rust-6b8d9dd0a09851b3e4f400ddd1303857945be25d.zip
Auto merge of #103831 - chenyukang:yukang/fix-103751-ice, r=nagisa
Fix capacity overflow issue during transmutability check

Fixes #103751
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/transmute/transmute-padding-ice.rs29
-rw-r--r--src/test/ui/transmute/transmute-padding-ice.stderr24
2 files changed, 53 insertions, 0 deletions
diff --git a/src/test/ui/transmute/transmute-padding-ice.rs b/src/test/ui/transmute/transmute-padding-ice.rs
new file mode 100644
index 00000000000..a1be7075a8a
--- /dev/null
+++ b/src/test/ui/transmute/transmute-padding-ice.rs
@@ -0,0 +1,29 @@
+#![crate_type = "lib"]
+#![feature(transmutability)]
+#![allow(dead_code)]
+
+mod assert {
+    use std::mem::{Assume, BikeshedIntrinsicFrom};
+    pub struct Context;
+
+    pub fn is_maybe_transmutable<Src, Dst>()
+    where
+        Dst: BikeshedIntrinsicFrom<
+            Src,
+            Context,
+            { Assume { alignment: true, lifetimes: true, safety: true, validity: true } },
+        >,
+    {
+    }
+}
+
+fn test() {
+    #[repr(C, align(2))]
+    struct A(u8, u8);
+
+    #[repr(C)]
+    struct B(u8, u8);
+
+    assert::is_maybe_transmutable::<B, A>();
+    //~^ ERROR cannot be safely transmuted
+}
diff --git a/src/test/ui/transmute/transmute-padding-ice.stderr b/src/test/ui/transmute/transmute-padding-ice.stderr
new file mode 100644
index 00000000000..c9233890f7a
--- /dev/null
+++ b/src/test/ui/transmute/transmute-padding-ice.stderr
@@ -0,0 +1,24 @@
+error[E0277]: `B` cannot be safely transmuted into `A` in the defining scope of `assert::Context`.
+  --> $DIR/transmute-padding-ice.rs:27:40
+   |
+LL |     assert::is_maybe_transmutable::<B, A>();
+   |                                        ^ `B` cannot be safely transmuted into `A` in the defining scope of `assert::Context`.
+   |
+   = help: the trait `BikeshedIntrinsicFrom<B, assert::Context, Assume { alignment: true, lifetimes: true, safety: true, validity: true }>` is not implemented for `A`
+note: required by a bound in `is_maybe_transmutable`
+  --> $DIR/transmute-padding-ice.rs:11:14
+   |
+LL |       pub fn is_maybe_transmutable<Src, Dst>()
+   |              --------------------- required by a bound in this
+LL |       where
+LL |           Dst: BikeshedIntrinsicFrom<
+   |  ______________^
+LL | |             Src,
+LL | |             Context,
+LL | |             { Assume { alignment: true, lifetimes: true, safety: true, validity: true } },
+LL | |         >,
+   | |_________^ required by this bound in `is_maybe_transmutable`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.