diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-01-25 22:19:52 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-25 22:19:52 +0100 |
| commit | 22e62a4fca14cd508c7dbf965164c0ca9b665bf3 (patch) | |
| tree | 1c0887c7643cc4e9396ae780779733c6cdd5f664 /library/core/src | |
| parent | 9e3f3306567f62086dcbb7f6a71f0a0c07db0de2 (diff) | |
| parent | 6d0c91fda35f7a78ff688ea623d1d2ee9b16cad7 (diff) | |
| download | rust-22e62a4fca14cd508c7dbf965164c0ca9b665bf3.tar.gz rust-22e62a4fca14cd508c7dbf965164c0ca9b665bf3.zip | |
Rollup merge of #106944 - Nilstrieb:there-once-was-a-diagnostic, r=WaffleLapkin
Suggest using a lock for `*Cell: Sync` bounds I mostly did this for `OnceCell<T>` at first because users will be confused to see that the `OnceCell<T>` in `std` isn't `Sync` but then extended it to `Cell<T>` and `RefCell<T>` as well.
Diffstat (limited to 'library/core/src')
| -rw-r--r-- | library/core/src/cell/once.rs | 4 | ||||
| -rw-r--r-- | library/core/src/marker.rs | 56 |
2 files changed, 60 insertions, 0 deletions
diff --git a/library/core/src/cell/once.rs b/library/core/src/cell/once.rs index 7757068a4f2..f74e563f1b9 100644 --- a/library/core/src/cell/once.rs +++ b/library/core/src/cell/once.rs @@ -298,3 +298,7 @@ impl<T> const From<T> for OnceCell<T> { OnceCell { inner: UnsafeCell::new(Some(value)) } } } + +// Just like for `Cell<T>` this isn't needed, but results in nicer error messages. +#[unstable(feature = "once_cell", issue = "74465")] +impl<T> !Sync for OnceCell<T> {} diff --git a/library/core/src/marker.rs b/library/core/src/marker.rs index 1326fc9ab09..74055602ec2 100644 --- a/library/core/src/marker.rs +++ b/library/core/src/marker.rs @@ -469,6 +469,62 @@ pub macro Copy($item:item) { #[cfg_attr(not(test), rustc_diagnostic_item = "Sync")] #[lang = "sync"] #[rustc_on_unimplemented( + on( + _Self = "std::cell::OnceCell<T>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::OnceLock` instead" + ), + on( + _Self = "std::cell::Cell<u8>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU8` instead", + ), + on( + _Self = "std::cell::Cell<u16>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU16` instead", + ), + on( + _Self = "std::cell::Cell<u32>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU32` instead", + ), + on( + _Self = "std::cell::Cell<u64>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicU64` instead", + ), + on( + _Self = "std::cell::Cell<usize>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicUsize` instead", + ), + on( + _Self = "std::cell::Cell<i8>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI8` instead", + ), + on( + _Self = "std::cell::Cell<i16>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI16` instead", + ), + on( + _Self = "std::cell::Cell<i32>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI32` instead", + ), + on( + _Self = "std::cell::Cell<i64>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicI64` instead", + ), + on( + _Self = "std::cell::Cell<isize>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicIsize` instead", + ), + on( + _Self = "std::cell::Cell<bool>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` or `std::sync::atomic::AtomicBool` instead", + ), + on( + _Self = "std::cell::Cell<T>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock`", + ), + on( + _Self = "std::cell::RefCell<T>", + note = "if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` instead", + ), message = "`{Self}` cannot be shared between threads safely", label = "`{Self}` cannot be shared between threads safely" )] |
