| //@ compile-flags: -Copt-level=3 -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::marker::PhantomPinned; | |
| // CHECK: define internal void @{{.*}}core{{.*}}ptr{{.*}}drop_in_place{{.*}}StructUnpin{{.*}}(ptr noalias nofree noundef align 4 dereferenceable(12) %{{.+}}) | |
| // CHECK: define internal void @{{.*}}core{{.*}}ptr{{.*}}drop_in_place{{.*}}StructNotUnpin{{.*}}(ptr noundef nonnull align 4 %{{.+}}) | |
| pub struct StructUnpin { | |
| a: i32, | |
| b: i32, | |
| c: i32, | |
| } | |
| impl Drop for StructUnpin { | |
| fn drop(&mut self) {} | |
| } | |
| pub struct StructNotUnpin { | |
| a: i32, | |
| b: i32, | |
| c: i32, | |
| p: PhantomPinned, | |
| } | |
| impl Drop for StructNotUnpin { | |
| fn drop(&mut self) {} | |
| } | |
| pub unsafe fn main(x: StructUnpin, y: StructNotUnpin) { | |
| drop(x); | |
| drop(y); | |
| } |