about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/codegen/drop-in-place-noalias.rs42
1 files changed, 23 insertions, 19 deletions
diff --git a/tests/codegen/drop-in-place-noalias.rs b/tests/codegen/drop-in-place-noalias.rs
index 64ac8760456..74d40c13c4c 100644
--- a/tests/codegen/drop-in-place-noalias.rs
+++ b/tests/codegen/drop-in-place-noalias.rs
@@ -1,34 +1,38 @@
-// Tests that the compiler can mark `drop_in_place` as `noalias` when safe to do so.
+// compile-flags: -C no-prepopulate-passes
+
+// Tests that the compiler can apply `noalias` and other &mut attributes to `drop_in_place`.
+// Note that non-Unpin types should not get `noalias`, matching &mut behavior.
 
 #![crate_type="lib"]
 
-use std::hint::black_box;
+use std::marker::PhantomPinned;
+
+// CHECK: define internal void @{{.*}}core{{.*}}ptr{{.*}}drop_in_place{{.*}}StructUnpin{{.*}}({{.*\*|ptr}} noalias noundef align 4 dereferenceable(12) %{{.+}})
 
-// CHECK: define{{.*}}core{{.*}}ptr{{.*}}drop_in_place{{.*}}Foo{{.*}}({{.*}}noalias {{.*}} align 4 dereferenceable(12){{.*}})
+// CHECK: define internal void @{{.*}}core{{.*}}ptr{{.*}}drop_in_place{{.*}}StructNotUnpin{{.*}}({{.*\*|ptr}} noundef nonnull align 4 %{{.+}})
 
-#[repr(C)]
-pub struct Foo {
+pub struct StructUnpin {
     a: i32,
     b: i32,
     c: i32,
 }
 
-impl Drop for Foo {
-    #[inline(never)]
-    fn drop(&mut self) {
-        black_box(self.a);
-    }
+impl Drop for StructUnpin {
+    fn drop(&mut self) {}
+}
+
+pub struct StructNotUnpin {
+    a: i32,
+    b: i32,
+    c: i32,
+    p: PhantomPinned,
 }
 
-extern {
-    fn bar();
-    fn baz(foo: Foo);
+impl Drop for StructNotUnpin {
+    fn drop(&mut self) {}
 }
 
-pub fn haha() {
-    let foo = Foo { a: 1, b: 2, c: 3 };
-    unsafe {
-        bar();
-        baz(foo);
-    }
+pub unsafe fn main(x: StructUnpin, y: StructNotUnpin) {
+    drop(x);
+    drop(y);
 }