//@ 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); }