blob: be87ab172653b6fdf881c7af5876f4ba12e6990b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
// Verify that UnsafeCell is *always* !Sync regardless if `T` is sync.
#![feature(negative_impls)]
use std::cell::UnsafeCell;
use std::marker::Sync;
struct MySync<T> {
u: UnsafeCell<T>
}
struct NoSync;
impl !Sync for NoSync {}
fn test<T: Sync>(s: T) {}
fn main() {
let us = UnsafeCell::new(MySync{u: UnsafeCell::new(0)});
test(us);
//~^ ERROR `UnsafeCell<MySync<{integer}>>` cannot be shared between threads safely
let uns = UnsafeCell::new(NoSync);
test(uns);
//~^ ERROR `UnsafeCell<NoSync>` cannot be shared between threads safely [E0277]
let ms = MySync{u: uns};
test(ms);
//~^ ERROR `UnsafeCell<NoSync>` cannot be shared between threads safely [E0277]
test(NoSync);
//~^ ERROR `NoSync` cannot be shared between threads safely [E0277]
}
|