summaryrefslogtreecommitdiffstats
path: root/src/test/ui/consts/const-eval/heap
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:02:58 +0000
commit698f8c2f01ea549d77d7dc3338a12e04c11057b9 (patch)
tree173a775858bd501c378080a10dca74132f05bc50 /src/test/ui/consts/const-eval/heap
parentInitial commit. (diff)
downloadrustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.tar.xz
rustc-698f8c2f01ea549d77d7dc3338a12e04c11057b9.zip
Adding upstream version 1.64.0+dfsg1.upstream/1.64.0+dfsg1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.rs15
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr15
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient.rs19
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.rs18
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.stderr8
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_transient.rs19
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.32bit.stderr14
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.64bit.stderr14
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.rs10
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.rs9
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.stderr8
-rw-r--r--src/test/ui/consts/const-eval/heap/alloc_intrinsic_zero_sized.rs16
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic.rs36
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.rs22
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.stderr15
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.rs13
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.stderr9
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.rs29
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.stderr27
-rw-r--r--src/test/ui/consts/const-eval/heap/dealloc_intrinsic_zero_sized.rs17
20 files changed, 333 insertions, 0 deletions
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.rs b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.rs
new file mode 100644
index 000000000..ac9e8b64b
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.rs
@@ -0,0 +1,15 @@
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+use std::intrinsics;
+
+const FOO: i32 = foo();
+const fn foo() -> i32 {
+ unsafe {
+ let _ = intrinsics::const_allocate(4, 3) as *mut i32;
+ //~^ error: evaluation of constant value failed
+ }
+ 1
+}
+
+fn main() {}
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr
new file mode 100644
index 000000000..2628a7845
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr
@@ -0,0 +1,15 @@
+error[E0080]: evaluation of constant value failed
+ --> $DIR/alloc_intrinsic_errors.rs:9:17
+ |
+LL | const FOO: i32 = foo();
+ | ----- inside `FOO` at $DIR/alloc_intrinsic_errors.rs:6:18
+...
+LL | let _ = intrinsics::const_allocate(4, 3) as *mut i32;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+ | |
+ | align has to be a power of 2, `3` is not a power of 2
+ | inside `foo` at $DIR/alloc_intrinsic_errors.rs:9:17
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient.rs b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient.rs
new file mode 100644
index 000000000..0a8fc7bca
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient.rs
@@ -0,0 +1,19 @@
+// run-pass
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+use std::intrinsics;
+
+const FOO: &i32 = foo();
+
+const fn foo() -> &'static i32 {
+ let t = unsafe {
+ let i = intrinsics::const_allocate(4, 4) as * mut i32;
+ *i = 20;
+ i
+ };
+ unsafe { &*t }
+}
+fn main() {
+ assert_eq!(*FOO, 20)
+}
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.rs b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.rs
new file mode 100644
index 000000000..f746f2700
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.rs
@@ -0,0 +1,18 @@
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+use std::intrinsics;
+
+const FOO: *const i32 = foo();
+//~^ ERROR untyped pointers are not allowed in constant
+
+const fn foo() -> &'static i32 {
+ let t = unsafe {
+ let i = intrinsics::const_allocate(4, 4) as * mut i32;
+ *i = 20;
+ i
+ };
+ unsafe { &*t }
+}
+fn main() {
+}
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.stderr b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.stderr
new file mode 100644
index 000000000..00ab0dfc5
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.stderr
@@ -0,0 +1,8 @@
+error: untyped pointers are not allowed in constant
+ --> $DIR/alloc_intrinsic_nontransient_fail.rs:6:1
+ |
+LL | const FOO: *const i32 = foo();
+ | ^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_transient.rs b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_transient.rs
new file mode 100644
index 000000000..92193bb33
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_transient.rs
@@ -0,0 +1,19 @@
+// run-pass
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+use std::intrinsics;
+
+const FOO: i32 = foo();
+
+const fn foo() -> i32 {
+ let t = unsafe {
+ let i = intrinsics::const_allocate(4, 4) as * mut i32;
+ *i = 20;
+ i
+ };
+ unsafe { *t }
+}
+fn main() {
+ assert_eq!(FOO, 20);
+}
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.32bit.stderr b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.32bit.stderr
new file mode 100644
index 000000000..f1a780926
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.32bit.stderr
@@ -0,0 +1,14 @@
+error[E0080]: it is undefined behavior to use this value
+ --> $DIR/alloc_intrinsic_uninit.rs:8:1
+ |
+LL | const BAR: &i32 = unsafe { &*(intrinsics::const_allocate(4, 4) as *mut i32) };
+ | ^^^^^^^^^^^^^^^ constructing invalid value at .<deref>: encountered uninitialized bytes, but expected initialized bytes
+ |
+ = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
+ = note: the raw bytes of the constant (size: 4, align: 4) {
+ ╾─alloc2──╼ │ ╾──╼
+ }
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.64bit.stderr b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.64bit.stderr
new file mode 100644
index 000000000..2eb401226
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.64bit.stderr
@@ -0,0 +1,14 @@
+error[E0080]: it is undefined behavior to use this value
+ --> $DIR/alloc_intrinsic_uninit.rs:8:1
+ |
+LL | const BAR: &i32 = unsafe { &*(intrinsics::const_allocate(4, 4) as *mut i32) };
+ | ^^^^^^^^^^^^^^^ constructing invalid value at .<deref>: encountered uninitialized bytes, but expected initialized bytes
+ |
+ = note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
+ = note: the raw bytes of the constant (size: 8, align: 8) {
+ ╾───────alloc2────────╼ │ ╾──────╼
+ }
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.rs b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.rs
new file mode 100644
index 000000000..b53c9ac7a
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_uninit.rs
@@ -0,0 +1,10 @@
+// stderr-per-bitwidth
+// compile-test
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+use std::intrinsics;
+
+const BAR: &i32 = unsafe { &*(intrinsics::const_allocate(4, 4) as *mut i32) };
+//~^ error: it is undefined behavior to use this value
+fn main() {}
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.rs b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.rs
new file mode 100644
index 000000000..77871c394
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.rs
@@ -0,0 +1,9 @@
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+use std::intrinsics;
+
+const BAR: *mut i32 = unsafe { intrinsics::const_allocate(4, 4) as *mut i32};
+//~^ error: untyped pointers are not allowed in constant
+
+fn main() {}
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.stderr b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.stderr
new file mode 100644
index 000000000..36002b850
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_untyped.stderr
@@ -0,0 +1,8 @@
+error: untyped pointers are not allowed in constant
+ --> $DIR/alloc_intrinsic_untyped.rs:6:1
+ |
+LL | const BAR: *mut i32 = unsafe { intrinsics::const_allocate(4, 4) as *mut i32};
+ | ^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/consts/const-eval/heap/alloc_intrinsic_zero_sized.rs b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_zero_sized.rs
new file mode 100644
index 000000000..407e69d41
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/alloc_intrinsic_zero_sized.rs
@@ -0,0 +1,16 @@
+// run-pass
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(inline_const)]
+
+use std::intrinsics;
+
+struct ZST;
+
+fn main() {
+ const {
+ unsafe {
+ let _ = intrinsics::const_allocate(0, 0) as *mut ZST;
+ }
+ }
+}
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic.rs b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic.rs
new file mode 100644
index 000000000..aac90cd54
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic.rs
@@ -0,0 +1,36 @@
+// run-pass
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+
+use std::intrinsics;
+
+const _X: () = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ intrinsics::const_deallocate(ptr, 4, 4);
+};
+
+const Y: &u32 = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4) as *mut u32;
+ *ptr = 42;
+ &*ptr
+};
+
+const Z: &u32 = &42;
+
+const _Z: () = unsafe {
+ let ptr1 = Y as *const _ as *mut u8;
+ intrinsics::const_deallocate(ptr1, 4, 4); // nop
+ intrinsics::const_deallocate(ptr1, 2, 4); // nop
+ intrinsics::const_deallocate(ptr1, 4, 2); // nop
+
+ let ptr2 = Z as *const _ as *mut u8;
+ intrinsics::const_deallocate(ptr2, 4, 4); // nop
+ intrinsics::const_deallocate(ptr2, 2, 4); // nop
+ intrinsics::const_deallocate(ptr2, 4, 2); // nop
+};
+
+fn main() {
+ assert_eq!(*Y, 42);
+ assert_eq!(*Z, 42);
+}
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.rs b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.rs
new file mode 100644
index 000000000..b6d89a58d
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.rs
@@ -0,0 +1,22 @@
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(const_mut_refs)]
+
+use std::intrinsics;
+
+const _X: &'static u8 = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ intrinsics::const_deallocate(ptr, 4, 4);
+ &*ptr
+ //~^ error: evaluation of constant value failed
+};
+
+const _Y: u8 = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ let reference = &*ptr;
+ intrinsics::const_deallocate(ptr, 4, 4);
+ *reference
+ //~^ error: evaluation of constant value failed
+};
+
+fn main() {}
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.stderr b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.stderr
new file mode 100644
index 000000000..4eb1c42e1
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.stderr
@@ -0,0 +1,15 @@
+error[E0080]: evaluation of constant value failed
+ --> $DIR/dealloc_intrinsic_dangling.rs:10:5
+ |
+LL | &*ptr
+ | ^^^^^ pointer to alloc2 was dereferenced after this allocation got freed
+
+error[E0080]: evaluation of constant value failed
+ --> $DIR/dealloc_intrinsic_dangling.rs:18:5
+ |
+LL | *reference
+ | ^^^^^^^^^^ pointer to alloc4 was dereferenced after this allocation got freed
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.rs b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.rs
new file mode 100644
index 000000000..4010b4769
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.rs
@@ -0,0 +1,13 @@
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+
+use std::intrinsics;
+
+const _X: () = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ intrinsics::const_deallocate(ptr, 4, 4);
+ intrinsics::const_deallocate(ptr, 4, 4);
+ //~^ error: evaluation of constant value failed
+};
+
+fn main() {}
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.stderr b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.stderr
new file mode 100644
index 000000000..8177a0850
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.stderr
@@ -0,0 +1,9 @@
+error[E0080]: evaluation of constant value failed
+ --> $DIR/dealloc_intrinsic_duplicate.rs:9:5
+ |
+LL | intrinsics::const_deallocate(ptr, 4, 4);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ pointer to alloc2 was dereferenced after this allocation got freed
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.rs b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.rs
new file mode 100644
index 000000000..031d70fdc
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.rs
@@ -0,0 +1,29 @@
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+
+use std::intrinsics;
+
+const _X: () = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ intrinsics::const_deallocate(ptr, 4, 2);
+ //~^ error: evaluation of constant value failed
+};
+const _Y: () = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ intrinsics::const_deallocate(ptr, 2, 4);
+ //~^ error: evaluation of constant value failed
+};
+
+const _Z: () = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ intrinsics::const_deallocate(ptr, 3, 4);
+ //~^ error: evaluation of constant value failed
+};
+
+const _W: () = unsafe {
+ let ptr = intrinsics::const_allocate(4, 4);
+ intrinsics::const_deallocate(ptr, 4, 3);
+ //~^ error: evaluation of constant value failed
+};
+
+fn main() {}
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.stderr b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.stderr
new file mode 100644
index 000000000..650b409b1
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.stderr
@@ -0,0 +1,27 @@
+error[E0080]: evaluation of constant value failed
+ --> $DIR/dealloc_intrinsic_incorrect_layout.rs:8:5
+ |
+LL | intrinsics::const_deallocate(ptr, 4, 2);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect layout on deallocation: alloc2 has size 4 and alignment 4, but gave size 4 and alignment 2
+
+error[E0080]: evaluation of constant value failed
+ --> $DIR/dealloc_intrinsic_incorrect_layout.rs:13:5
+ |
+LL | intrinsics::const_deallocate(ptr, 2, 4);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect layout on deallocation: alloc4 has size 4 and alignment 4, but gave size 2 and alignment 4
+
+error[E0080]: evaluation of constant value failed
+ --> $DIR/dealloc_intrinsic_incorrect_layout.rs:19:5
+ |
+LL | intrinsics::const_deallocate(ptr, 3, 4);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ incorrect layout on deallocation: alloc6 has size 4 and alignment 4, but gave size 3 and alignment 4
+
+error[E0080]: evaluation of constant value failed
+ --> $DIR/dealloc_intrinsic_incorrect_layout.rs:25:5
+ |
+LL | intrinsics::const_deallocate(ptr, 4, 3);
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ align has to be a power of 2, `3` is not a power of 2
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0080`.
diff --git a/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_zero_sized.rs b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_zero_sized.rs
new file mode 100644
index 000000000..84fb4d2ea
--- /dev/null
+++ b/src/test/ui/consts/const-eval/heap/dealloc_intrinsic_zero_sized.rs
@@ -0,0 +1,17 @@
+// run-pass
+#![feature(core_intrinsics)]
+#![feature(const_heap)]
+#![feature(inline_const)]
+
+use std::intrinsics;
+
+fn main() {
+ const {
+ unsafe {
+ let ptr1 = intrinsics::const_allocate(0, 0);
+ let ptr2 = intrinsics::const_allocate(0, 0);
+ intrinsics::const_deallocate(ptr1, 0, 0);
+ intrinsics::const_deallocate(ptr2, 0, 0);
+ }
+ }
+}