| //@ compile-flags: -O -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 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); |
| } |