Skip to content

Commit 2fb2098

Browse files
committed
add known-bug test for unsound issue 49206
1 parent adb5ded commit 2fb2098

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// check-pass
2+
// known-bug: #49206
3+
4+
// Should fail. Compiles and prints 2 identical addresses, which shows 2 threads
5+
// with the same `'static` reference to non-`Sync` struct. The problem is that
6+
// promotion to static does not check if the type is `Sync`.
7+
8+
#[allow(dead_code)]
9+
#[derive(Debug)]
10+
struct Foo {
11+
value: u32,
12+
}
13+
14+
// stable negative impl trick from https://crates.io/crates/negative-impl
15+
// see https://github.com/taiki-e/pin-project/issues/102#issuecomment-540472282
16+
// for details.
17+
struct Wrapper<'a, T>(::std::marker::PhantomData<&'a ()>, T);
18+
unsafe impl<T> Sync for Wrapper<'_, T> where T: Sync {}
19+
unsafe impl<'a> std::marker::Sync for Foo where Wrapper<'a, *const ()>: Sync {}
20+
fn _assert_sync<T: Sync>() {}
21+
22+
fn inspect() {
23+
let foo: &'static Foo = &Foo { value: 1 };
24+
println!(
25+
"I am in thread {:?}, address: {:p}",
26+
std::thread::current().id(),
27+
foo as *const Foo,
28+
);
29+
}
30+
31+
fn main() {
32+
// _assert_sync::<Foo>(); // uncomment this line causes compile error
33+
// "`*const ()` cannot be shared between threads safely"
34+
35+
let handle = std::thread::spawn(inspect);
36+
inspect();
37+
handle.join().unwrap();
38+
}

0 commit comments

Comments
 (0)