about summary refs log tree commit diff
path: root/tests/codegen/maybeuninit-rvo.rs
diff options
context:
space:
mode:
authorJakub Beránek <berykubik@gmail.com>2024-01-03 21:04:02 +0100
committerJakub Beránek <berykubik@gmail.com>2024-01-03 21:18:07 +0100
commit0c56ccff048570161bcc64470689b9e6b0f4158e (patch)
tree3eafd5e9368e7db07e9a67f3c68329af3bbc2132 /tests/codegen/maybeuninit-rvo.rs
parent1a47f5b448f1e023e7ffd2eb57d473d619d2c04d (diff)
downloadrust-0c56ccff048570161bcc64470689b9e6b0f4158e.tar.gz
rust-0c56ccff048570161bcc64470689b9e6b0f4158e.zip
Add codegen test for RVO on MaybeUninit
Currently, this only works with `-Cpanic=abort`.
Diffstat (limited to 'tests/codegen/maybeuninit-rvo.rs')
-rw-r--r--tests/codegen/maybeuninit-rvo.rs33
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/codegen/maybeuninit-rvo.rs b/tests/codegen/maybeuninit-rvo.rs
new file mode 100644
index 00000000000..feed513e1fb
--- /dev/null
+++ b/tests/codegen/maybeuninit-rvo.rs
@@ -0,0 +1,33 @@
+// compile-flags: -O
+#![feature(c_unwind)]
+#![crate_type = "lib"]
+
+pub struct Foo([u8; 1000]);
+
+extern "C" {
+    fn init(p: *mut Foo);
+}
+
+pub fn new_from_uninit() -> Foo {
+    // CHECK-LABEL: new_from_uninit
+    // CHECK-NOT: call void @llvm.memcpy.
+    let mut x = std::mem::MaybeUninit::uninit();
+    unsafe {
+        init(x.as_mut_ptr());
+        x.assume_init()
+    }
+}
+
+extern "C-unwind" {
+    fn init_unwind(p: *mut Foo);
+}
+
+pub fn new_from_uninit_unwind() -> Foo {
+    // CHECK-LABEL: new_from_uninit
+    // CHECK: call void @llvm.memcpy.
+    let mut x = std::mem::MaybeUninit::uninit();
+    unsafe {
+        init_unwind(x.as_mut_ptr());
+        x.assume_init()
+    }
+}