2019-07-27 00:54:25 +03:00
|
|
|
// run-pass
|
|
|
|
|
|
2020-02-14 16:54:40 +00:00
|
|
|
#![feature(llvm_asm)]
|
2018-09-19 16:28:06 +02:00
|
|
|
#![allow(dead_code)]
|
2017-12-23 23:45:07 +00:00
|
|
|
|
|
|
|
|
use std::cell::Cell;
|
|
|
|
|
|
|
|
|
|
#[repr(C)]
|
|
|
|
|
struct NoisyDrop<'a>(&'a Cell<&'static str>);
|
|
|
|
|
impl<'a> Drop for NoisyDrop<'a> {
|
|
|
|
|
fn drop(&mut self) {
|
|
|
|
|
self.0.set("destroyed");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
|
|
|
|
fn main() {
|
|
|
|
|
let status = Cell::new("alive");
|
|
|
|
|
{
|
|
|
|
|
let _y: Box<NoisyDrop>;
|
|
|
|
|
let x = Box::new(NoisyDrop(&status));
|
|
|
|
|
unsafe {
|
2020-02-14 16:54:40 +00:00
|
|
|
llvm_asm!("mov $1, $0" : "=r"(_y) : "r"(x));
|
2017-12-23 23:45:07 +00:00
|
|
|
}
|
|
|
|
|
assert_eq!(status.get(), "alive");
|
|
|
|
|
}
|
|
|
|
|
assert_eq!(status.get(), "destroyed");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
|
|
|
|
|
fn main() {}
|