mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-30 10:45:18 +00:00
53 lines
1.1 KiB
Rust
53 lines
1.1 KiB
Rust
//@ run-pass
|
|
#![allow(dead_code)]
|
|
#![allow(unused_variables)]
|
|
#![allow(unused_imports)]
|
|
//@ pretty-expanded FIXME #23616
|
|
|
|
use std::marker;
|
|
use std::cell::UnsafeCell;
|
|
|
|
struct MyUnsafePack<T>(UnsafeCell<T>);
|
|
|
|
unsafe impl<T: Send> Sync for MyUnsafePack<T> {}
|
|
|
|
struct MyUnsafe<T> {
|
|
value: MyUnsafePack<T>
|
|
}
|
|
|
|
impl<T> MyUnsafe<T> {
|
|
fn forbidden(&self) {}
|
|
}
|
|
|
|
unsafe impl<T: Send> Sync for MyUnsafe<T> {}
|
|
|
|
enum UnsafeEnum<T> {
|
|
VariantSafe,
|
|
VariantUnsafe(UnsafeCell<T>)
|
|
}
|
|
|
|
unsafe impl<T: Send> Sync for UnsafeEnum<T> {}
|
|
|
|
static STATIC1: UnsafeEnum<isize> = UnsafeEnum::VariantSafe;
|
|
|
|
static STATIC2: MyUnsafePack<isize> = MyUnsafePack(UnsafeCell::new(1));
|
|
const CONST: MyUnsafePack<isize> = MyUnsafePack(UnsafeCell::new(1));
|
|
static STATIC3: MyUnsafe<isize> = MyUnsafe{value: CONST};
|
|
|
|
static STATIC4: &'static MyUnsafePack<isize> = &STATIC2;
|
|
|
|
struct Wrap<T> {
|
|
value: T
|
|
}
|
|
|
|
unsafe impl<T: Send> Sync for Wrap<T> {}
|
|
|
|
static UNSAFE: MyUnsafePack<isize> = MyUnsafePack(UnsafeCell::new(2));
|
|
static WRAPPED_UNSAFE: Wrap<&'static MyUnsafePack<isize>> = Wrap { value: &UNSAFE };
|
|
|
|
fn main() {
|
|
let a = &STATIC1;
|
|
|
|
STATIC3.forbidden()
|
|
}
|