summaryrefslogtreecommitdiffstats
path: root/tests/ui/mir/alignment
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/mir/alignment')
-rw-r--r--tests/ui/mir/alignment/addrof_alignment.rs14
-rw-r--r--tests/ui/mir/alignment/i686-pc-windows-msvc.rs21
-rw-r--r--tests/ui/mir/alignment/misaligned_lhs.rs13
-rw-r--r--tests/ui/mir/alignment/misaligned_rhs.rs13
-rw-r--r--tests/ui/mir/alignment/packed.rs29
-rw-r--r--tests/ui/mir/alignment/place_computation.rs16
-rw-r--r--tests/ui/mir/alignment/place_without_read.rs9
-rw-r--r--tests/ui/mir/alignment/two_pointers.rs15
8 files changed, 130 insertions, 0 deletions
diff --git a/tests/ui/mir/alignment/addrof_alignment.rs b/tests/ui/mir/alignment/addrof_alignment.rs
new file mode 100644
index 000000000..f3423e97a
--- /dev/null
+++ b/tests/ui/mir/alignment/addrof_alignment.rs
@@ -0,0 +1,14 @@
+// run-pass
+// compile-flags: -C debug-assertions
+
+struct Misalignment {
+ a: u32,
+}
+
+fn main() {
+ let items: [Misalignment; 2] = [Misalignment { a: 0 }, Misalignment { a: 1 }];
+ unsafe {
+ let ptr: *const Misalignment = items.as_ptr().byte_add(1);
+ let _ptr = core::ptr::addr_of!((*ptr).a);
+ }
+}
diff --git a/tests/ui/mir/alignment/i686-pc-windows-msvc.rs b/tests/ui/mir/alignment/i686-pc-windows-msvc.rs
new file mode 100644
index 000000000..74ba1fde6
--- /dev/null
+++ b/tests/ui/mir/alignment/i686-pc-windows-msvc.rs
@@ -0,0 +1,21 @@
+// run-pass
+// only-i686-pc-windows-msvc
+// compile-flags: -Copt-level=0 -Cdebug-assertions=yes
+
+// MSVC isn't sure if on 32-bit Windows its u64 type is 8-byte-aligned or 4-byte-aligned.
+// So this test ensures that on i686-pc-windows-msvc, we do not insert a runtime check
+// that will fail on dereferencing of a pointer to u64 which is not 8-byte-aligned but is
+// 4-byte-aligned.
+
+#![feature(strict_provenance)]
+
+fn main() {
+ let mut x = [0u64; 2];
+ let ptr = x.as_mut_ptr();
+ unsafe {
+ let misaligned = ptr.byte_add(4);
+ assert!(misaligned.addr() % 8 != 0);
+ assert!(misaligned.addr() % 4 == 0);
+ *misaligned = 42;
+ }
+}
diff --git a/tests/ui/mir/alignment/misaligned_lhs.rs b/tests/ui/mir/alignment/misaligned_lhs.rs
new file mode 100644
index 000000000..97644ba8e
--- /dev/null
+++ b/tests/ui/mir/alignment/misaligned_lhs.rs
@@ -0,0 +1,13 @@
+// run-fail
+// ignore-wasm32-bare: No panic messages
+// ignore-i686-pc-windows-msvc: #112480
+// compile-flags: -C debug-assertions
+// error-pattern: misaligned pointer dereference: address must be a multiple of 0x4 but is
+
+fn main() {
+ let mut x = [0u32; 2];
+ let ptr = x.as_mut_ptr();
+ unsafe {
+ *(ptr.byte_add(1)) = 42;
+ }
+}
diff --git a/tests/ui/mir/alignment/misaligned_rhs.rs b/tests/ui/mir/alignment/misaligned_rhs.rs
new file mode 100644
index 000000000..8534bc71a
--- /dev/null
+++ b/tests/ui/mir/alignment/misaligned_rhs.rs
@@ -0,0 +1,13 @@
+// run-fail
+// ignore-wasm32-bare: No panic messages
+// ignore-i686-pc-windows-msvc: #112480
+// compile-flags: -C debug-assertions
+// error-pattern: misaligned pointer dereference: address must be a multiple of 0x4 but is
+
+fn main() {
+ let mut x = [0u32; 2];
+ let ptr = x.as_mut_ptr();
+ unsafe {
+ let _v = *(ptr.byte_add(1));
+ }
+}
diff --git a/tests/ui/mir/alignment/packed.rs b/tests/ui/mir/alignment/packed.rs
new file mode 100644
index 000000000..754698591
--- /dev/null
+++ b/tests/ui/mir/alignment/packed.rs
@@ -0,0 +1,29 @@
+// run-pass
+// compile-flags: -C debug-assertions
+
+#![feature(strict_provenance, pointer_is_aligned)]
+
+#[repr(packed)]
+struct Misaligner {
+ _head: u8,
+ tail: u64,
+}
+
+fn main() {
+ let memory = [Misaligner { _head: 0, tail: 0}, Misaligner { _head: 0, tail: 0}];
+ // Test that we can use addr_of! to get the address of a packed member which according to its
+ // type is not aligned, but because it is a projection from a packed type is a valid place.
+ let ptr0 = std::ptr::addr_of!(memory[0].tail);
+ let ptr1 = std::ptr::addr_of!(memory[0].tail);
+ // Even if ptr0 happens to be aligned by chance, ptr1 is not.
+ assert!(!ptr0.is_aligned() || !ptr1.is_aligned());
+
+ // And also test that we can get the addr of a packed struct then do a member read from it.
+ unsafe {
+ let ptr = std::ptr::addr_of!(memory[0]);
+ let _tail = (*ptr).tail;
+
+ let ptr = std::ptr::addr_of!(memory[1]);
+ let _tail = (*ptr).tail;
+ }
+}
diff --git a/tests/ui/mir/alignment/place_computation.rs b/tests/ui/mir/alignment/place_computation.rs
new file mode 100644
index 000000000..fdd486425
--- /dev/null
+++ b/tests/ui/mir/alignment/place_computation.rs
@@ -0,0 +1,16 @@
+// run-pass
+// compile-flags: -C debug-assertions
+
+#[repr(align(8))]
+struct Misalignment {
+ a: u8,
+}
+
+fn main() {
+ let mem = 0u64;
+ let ptr = &mem as *const u64 as *const Misalignment;
+ unsafe {
+ let ptr = ptr.byte_add(1);
+ let _ref: &u8 = &(*ptr).a;
+ }
+}
diff --git a/tests/ui/mir/alignment/place_without_read.rs b/tests/ui/mir/alignment/place_without_read.rs
new file mode 100644
index 000000000..b4be7a50f
--- /dev/null
+++ b/tests/ui/mir/alignment/place_without_read.rs
@@ -0,0 +1,9 @@
+// run-pass
+// compile-flags: -C debug-assertions
+
+fn main() {
+ let ptr = 1 as *const u16;
+ unsafe {
+ let _ = *ptr;
+ }
+}
diff --git a/tests/ui/mir/alignment/two_pointers.rs b/tests/ui/mir/alignment/two_pointers.rs
new file mode 100644
index 000000000..29af21dff
--- /dev/null
+++ b/tests/ui/mir/alignment/two_pointers.rs
@@ -0,0 +1,15 @@
+// run-fail
+// ignore-wasm32-bare: No panic messages
+// ignore-i686-pc-windows-msvc: #112480
+// compile-flags: -C debug-assertions
+// error-pattern: misaligned pointer dereference: address must be a multiple of 0x4 but is
+
+fn main() {
+ let x = [0u32; 2];
+ let ptr = x.as_ptr();
+ let mut dest = 0u32;
+ let dest_ptr = &mut dest as *mut u32;
+ unsafe {
+ *dest_ptr = *(ptr.byte_add(1));
+ }
+}