| //@run-pass | |
| #![feature(sync_unsafe_cell)] | |
| use std::cell::SyncUnsafeCell; | |
| use std::ptr; | |
| #[repr(C)] | |
| struct SyncPtr { | |
| foo: *mut u32, | |
| } | |
| unsafe impl Sync for SyncPtr {} | |
| static mut STATIC: u32 = 42; | |
| static INTERIOR_MUTABLE_STATIC: SyncUnsafeCell<u32> = SyncUnsafeCell::new(42); | |
| // A static that mutably points to STATIC. | |
| static PTR: SyncPtr = SyncPtr { foo: ptr::addr_of_mut!(STATIC) }; | |
| static INTERIOR_MUTABLE_PTR: SyncPtr = | |
| SyncPtr { foo: ptr::addr_of!(INTERIOR_MUTABLE_STATIC) as *mut u32 }; | |
| fn main() { | |
| let ptr = PTR.foo; | |
| unsafe { | |
| assert_eq!(*ptr, 42); | |
| *ptr = 0; | |
| assert_eq!(*PTR.foo, 0); | |
| } | |
| let ptr = INTERIOR_MUTABLE_PTR.foo; | |
| unsafe { | |
| assert_eq!(*ptr, 42); | |
| *ptr = 0; | |
| assert_eq!(*INTERIOR_MUTABLE_PTR.foo, 0); | |
| } | |
| } |