summaryrefslogtreecommitdiffstats
path: root/tests/ui/consts/const-eval/heap
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-17 12:19:03 +0000
commit64d98f8ee037282c35007b64c2649055c56af1db (patch)
tree5492bcf97fce41ee1c0b1cc2add283f3e66cdab0 /tests/ui/consts/const-eval/heap
parentAdding debian version 1.67.1+dfsg1-1. (diff)
downloadrustc-64d98f8ee037282c35007b64c2649055c56af1db.tar.xz
rustc-64d98f8ee037282c35007b64c2649055c56af1db.zip
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/consts/const-eval/heap')
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_errors.rs15
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr20
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient.rs19
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.rs18
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.stderr8
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_transient.rs19
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.32bit.stderr14
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.64bit.stderr14
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.rs10
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_untyped.rs9
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_untyped.stderr8
-rw-r--r--tests/ui/consts/const-eval/heap/alloc_intrinsic_zero_sized.rs16
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic.rs36
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.rs22
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.stderr15
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.rs13
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.stderr9
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.rs29
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.stderr27
-rw-r--r--tests/ui/consts/const-eval/heap/dealloc_intrinsic_zero_sized.rs17
20 files changed, 338 insertions, 0 deletions
diff --git a/tests/ui/consts/const-eval/heap/alloc_intrinsic_errors.rs b/tests/ui/consts/const-eval/heap/alloc_intrinsic_errors.rs
new file mode 100644
index 000000000..ac9e8b64b
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr b/tests/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr
new file mode 100644
index 000000000..8f3b3d5f7
--- /dev/null
+++ b/tests/ui/consts/const-eval/heap/alloc_intrinsic_errors.stderr
@@ -0,0 +1,20 @@
+error[E0080]: evaluation of constant value failed
+ --> $DIR/alloc_intrinsic_errors.rs:9:17
+ |
+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
+ |
+note: inside `foo`
+ --> $DIR/alloc_intrinsic_errors.rs:9:17
+ |
+LL | let _ = intrinsics::const_allocate(4, 3) as *mut i32;
+ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+note: inside `FOO`
+ --> $DIR/alloc_intrinsic_errors.rs:6:18
+ |
+LL | const FOO: i32 = foo();
+ | ^^^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0080`.
diff --git a/tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient.rs b/tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient.rs
new file mode 100644
index 000000000..0a8fc7bca
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.rs b/tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.rs
new file mode 100644
index 000000000..f746f2700
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.stderr b/tests/ui/consts/const-eval/heap/alloc_intrinsic_nontransient_fail.stderr
new file mode 100644
index 000000000..00ab0dfc5
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_transient.rs b/tests/ui/consts/const-eval/heap/alloc_intrinsic_transient.rs
new file mode 100644
index 000000000..92193bb33
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.32bit.stderr b/tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.32bit.stderr
new file mode 100644
index 000000000..a0f4519ea
--- /dev/null
+++ b/tests/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 memory, but expected an integer
+ |
+ = 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/tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.64bit.stderr b/tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.64bit.stderr
new file mode 100644
index 000000000..d2bffa425
--- /dev/null
+++ b/tests/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 memory, but expected an integer
+ |
+ = 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/tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.rs b/tests/ui/consts/const-eval/heap/alloc_intrinsic_uninit.rs
new file mode 100644
index 000000000..b53c9ac7a
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_untyped.rs b/tests/ui/consts/const-eval/heap/alloc_intrinsic_untyped.rs
new file mode 100644
index 000000000..77871c394
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_untyped.stderr b/tests/ui/consts/const-eval/heap/alloc_intrinsic_untyped.stderr
new file mode 100644
index 000000000..36002b850
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/alloc_intrinsic_zero_sized.rs b/tests/ui/consts/const-eval/heap/alloc_intrinsic_zero_sized.rs
new file mode 100644
index 000000000..407e69d41
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic.rs b/tests/ui/consts/const-eval/heap/dealloc_intrinsic.rs
new file mode 100644
index 000000000..aac90cd54
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.rs b/tests/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.rs
new file mode 100644
index 000000000..b6d89a58d
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.stderr b/tests/ui/consts/const-eval/heap/dealloc_intrinsic_dangling.stderr
new file mode 100644
index 000000000..4eb1c42e1
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.rs b/tests/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.rs
new file mode 100644
index 000000000..4010b4769
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.stderr b/tests/ui/consts/const-eval/heap/dealloc_intrinsic_duplicate.stderr
new file mode 100644
index 000000000..8177a0850
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.rs b/tests/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.rs
new file mode 100644
index 000000000..031d70fdc
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.stderr b/tests/ui/consts/const-eval/heap/dealloc_intrinsic_incorrect_layout.stderr
new file mode 100644
index 000000000..650b409b1
--- /dev/null
+++ b/tests/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/tests/ui/consts/const-eval/heap/dealloc_intrinsic_zero_sized.rs b/tests/ui/consts/const-eval/heap/dealloc_intrinsic_zero_sized.rs
new file mode 100644
index 000000000..84fb4d2ea
--- /dev/null
+++ b/tests/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);
+ }
+ }
+}