2019-06-23 10:26:12 -05:00
|
|
|
// This should fail even without validation
|
|
|
|
// compile-flags: -Zmiri-disable-validation
|
2019-05-29 12:35:47 -05:00
|
|
|
#![feature(weak_into_raw)]
|
|
|
|
|
|
|
|
use std::rc::{Rc, Weak};
|
|
|
|
use std::ptr;
|
|
|
|
|
|
|
|
/// Taken from the `Weak::as_raw` doctest.
|
|
|
|
fn main() {
|
|
|
|
let strong = Rc::new(Box::new(42));
|
|
|
|
let weak = Rc::downgrade(&strong);
|
|
|
|
// Both point to the same object
|
|
|
|
assert!(ptr::eq(&*strong, Weak::as_raw(&weak)));
|
|
|
|
// The strong here keeps it alive, so we can still access the object.
|
|
|
|
assert_eq!(42, **unsafe { &*Weak::as_raw(&weak) });
|
|
|
|
|
|
|
|
drop(strong);
|
|
|
|
// But not any more. We can do Weak::as_raw(&weak), but accessing the pointer would lead to
|
|
|
|
// undefined behaviour.
|
2020-03-08 17:34:54 -05:00
|
|
|
assert_eq!(42, **unsafe { &*Weak::as_raw(&weak) }); //~ ERROR dereferenced after this allocation got freed
|
2019-05-29 12:35:47 -05:00
|
|
|
}
|