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