summaryrefslogtreecommitdiffstats
path: root/tests/ui/lint/unaligned_references.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /tests/ui/lint/unaligned_references.rs
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/lint/unaligned_references.rs')
-rw-r--r--tests/ui/lint/unaligned_references.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/tests/ui/lint/unaligned_references.rs b/tests/ui/lint/unaligned_references.rs
index 0c9c79c08..3f6dab354 100644
--- a/tests/ui/lint/unaligned_references.rs
+++ b/tests/ui/lint/unaligned_references.rs
@@ -1,3 +1,6 @@
+use std::mem::ManuallyDrop;
+use std::fmt::Debug;
+
#[repr(packed)]
pub struct Good {
data: u64,
@@ -27,6 +30,26 @@ impl Foo for Packed2 {
}
}
+// Test for #115396
+fn packed_dyn() {
+ #[repr(packed)]
+ struct Unaligned<T: ?Sized>(ManuallyDrop<T>);
+
+ let ref local = Unaligned(ManuallyDrop::new([3, 5, 8u64]));
+ let foo: &Unaligned<dyn Debug> = &*local;
+ println!("{:?}", &*foo.0); //~ ERROR reference to packed field
+ let foo: &Unaligned<[u64]> = &*local;
+ println!("{:?}", &*foo.0); //~ ERROR reference to packed field
+
+ // Even if the actual alignment is 1, we cannot know that when looking at `dyn Debug.`
+ let ref local = Unaligned(ManuallyDrop::new([3, 5, 8u8]));
+ let foo: &Unaligned<dyn Debug> = &*local;
+ println!("{:?}", &*foo.0); //~ ERROR reference to packed field
+ // However, we *can* know the alignment when looking at a slice.
+ let foo: &Unaligned<[u8]> = &*local;
+ println!("{:?}", &*foo.0); // no error!
+}
+
fn main() {
unsafe {
let good = Good { data: 0, ptr: &0, data2: [0, 0], aligned: [0; 32] };