2018-08-30 14:18:55 +02:00
|
|
|
//@ run-pass
|
2018-09-25 23:51:35 +02:00
|
|
|
#![allow(dead_code)]
|
|
|
|
#![allow(unused_variables)]
|
|
|
|
#![allow(unused_imports)]
|
2015-03-22 13:13:15 -07:00
|
|
|
//@ pretty-expanded FIXME #23616
|
|
|
|
|
2015-01-07 11:33:42 +13:00
|
|
|
use std::marker;
|
2014-12-22 12:29:46 +01:00
|
|
|
use std::cell::UnsafeCell;
|
2014-03-13 01:02:31 +01:00
|
|
|
|
2014-12-23 10:57:44 +01:00
|
|
|
struct MyUnsafePack<T>(UnsafeCell<T>);
|
|
|
|
|
|
|
|
unsafe impl<T: Send> Sync for MyUnsafePack<T> {}
|
|
|
|
|
2014-03-13 01:02:31 +01:00
|
|
|
struct MyUnsafe<T> {
|
2014-12-23 10:57:44 +01:00
|
|
|
value: MyUnsafePack<T>
|
2014-03-13 01:02:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> MyUnsafe<T> {
|
|
|
|
fn forbidden(&self) {}
|
|
|
|
}
|
|
|
|
|
2014-12-23 10:57:44 +01:00
|
|
|
unsafe impl<T: Send> Sync for MyUnsafe<T> {}
|
2014-12-22 17:15:51 +01:00
|
|
|
|
2014-03-13 01:02:31 +01:00
|
|
|
enum UnsafeEnum<T> {
|
|
|
|
VariantSafe,
|
2014-12-22 17:15:51 +01:00
|
|
|
VariantUnsafe(UnsafeCell<T>)
|
2014-03-13 01:02:31 +01:00
|
|
|
}
|
|
|
|
|
2014-12-23 10:57:44 +01:00
|
|
|
unsafe impl<T: Send> Sync for UnsafeEnum<T> {}
|
2014-12-22 17:15:51 +01:00
|
|
|
|
2015-03-25 17:06:52 -07:00
|
|
|
static STATIC1: UnsafeEnum<isize> = UnsafeEnum::VariantSafe;
|
2014-03-13 01:02:31 +01:00
|
|
|
|
2015-05-27 11:18:36 +03:00
|
|
|
static STATIC2: MyUnsafePack<isize> = MyUnsafePack(UnsafeCell::new(1));
|
|
|
|
const CONST: MyUnsafePack<isize> = MyUnsafePack(UnsafeCell::new(1));
|
2015-03-25 17:06:52 -07:00
|
|
|
static STATIC3: MyUnsafe<isize> = MyUnsafe{value: CONST};
|
2014-03-13 01:02:31 +01:00
|
|
|
|
2015-03-25 17:06:52 -07:00
|
|
|
static STATIC4: &'static MyUnsafePack<isize> = &STATIC2;
|
2014-03-13 01:02:31 +01:00
|
|
|
|
2014-03-22 19:49:25 +01:00
|
|
|
struct Wrap<T> {
|
|
|
|
value: T
|
|
|
|
}
|
|
|
|
|
2014-12-22 00:49:42 +01:00
|
|
|
unsafe impl<T: Send> Sync for Wrap<T> {}
|
2014-12-06 11:39:25 -05:00
|
|
|
|
2015-05-27 11:18:36 +03:00
|
|
|
static UNSAFE: MyUnsafePack<isize> = MyUnsafePack(UnsafeCell::new(2));
|
2015-03-25 17:06:52 -07:00
|
|
|
static WRAPPED_UNSAFE: Wrap<&'static MyUnsafePack<isize>> = Wrap { value: &UNSAFE };
|
2014-03-13 01:02:31 +01:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let a = &STATIC1;
|
|
|
|
|
|
|
|
STATIC3.forbidden()
|
|
|
|
}
|