about summary refs log tree commit diff
path: root/tests/ui/consts/const-eval/ptr_fragments_in_final.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/consts/const-eval/ptr_fragments_in_final.rs')
-rw-r--r--tests/ui/consts/const-eval/ptr_fragments_in_final.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/tests/ui/consts/const-eval/ptr_fragments_in_final.rs b/tests/ui/consts/const-eval/ptr_fragments_in_final.rs
new file mode 100644
index 00000000000..e2f3f51b086
--- /dev/null
+++ b/tests/ui/consts/const-eval/ptr_fragments_in_final.rs
@@ -0,0 +1,25 @@
+//! Test that we properly error when there is a pointer fragment in the final value.
+
+use std::{mem::{self, MaybeUninit}, ptr};
+
+type Byte = MaybeUninit<u8>;
+
+const unsafe fn memcpy(dst: *mut Byte, src: *const Byte, n: usize) {
+    let mut i = 0;
+    while i < n {
+        dst.add(i).write(src.add(i).read());
+        i += 1;
+    }
+}
+
+const MEMCPY_RET: MaybeUninit<*const i32> = unsafe { //~ERROR: partial pointer in final value
+    let ptr = &42;
+    let mut ptr2 = MaybeUninit::new(ptr::null::<i32>());
+    memcpy(&mut ptr2 as *mut _ as *mut _, &ptr as *const _ as *const _, mem::size_of::<&i32>() / 2);
+    // Return in a MaybeUninit so it does not get treated as a scalar.
+    ptr2
+};
+
+fn main() {
+    assert_eq!(unsafe { MEMCPY_RET.assume_init().read() }, 42);
+}