39 lines
934 B
Rust
39 lines
934 B
Rust
// 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);
|
|
}
|