diff options
| author | Andrew Paseltiner <apaseltiner@gmail.com> | 2016-02-29 22:03:23 -0500 |
|---|---|---|
| committer | Andrew Paseltiner <apaseltiner@gmail.com> | 2016-03-01 18:51:46 -0500 |
| commit | f522d882373067ab79ea0fdc30be6150eeccb1fd (patch) | |
| tree | 16ba657f47d2e5fe3fcb0e5bc7b483062e400225 /src | |
| parent | 52cb8a9d39d05126a79e7b9a3adc31a5e3cdde94 (diff) | |
| download | rust-f522d882373067ab79ea0fdc30be6150eeccb1fd.tar.gz rust-f522d882373067ab79ea0fdc30be6150eeccb1fd.zip | |
Explicitly opt out of `Sync` for `cell` and `mpsc` types
These types were already `!Sync`, but this improves error messages when they are used in contexts that require `Sync`, aligning them with conventions used with `Rc`, among others.
Diffstat (limited to 'src')
| -rw-r--r-- | src/libcore/cell.rs | 6 | ||||
| -rw-r--r-- | src/libstd/sync/mpsc/mod.rs | 6 | ||||
| -rw-r--r-- | src/test/compile-fail/comm-not-freeze-receiver.rs | 17 | ||||
| -rw-r--r-- | src/test/compile-fail/comm-not-freeze.rs | 17 | ||||
| -rw-r--r-- | src/test/compile-fail/no_share-rc.rs | 20 | ||||
| -rw-r--r-- | src/test/compile-fail/not-sync.rs | 34 |
6 files changed, 46 insertions, 54 deletions
diff --git a/src/libcore/cell.rs b/src/libcore/cell.rs index 255c846244b..144adde12e4 100644 --- a/src/libcore/cell.rs +++ b/src/libcore/cell.rs @@ -242,6 +242,9 @@ impl<T:Copy> Cell<T> { unsafe impl<T> Send for Cell<T> where T: Send {} #[stable(feature = "rust1", since = "1.0.0")] +impl<T> !Sync for Cell<T> {} + +#[stable(feature = "rust1", since = "1.0.0")] impl<T:Copy> Clone for Cell<T> { #[inline] fn clone(&self) -> Cell<T> { @@ -462,6 +465,9 @@ impl<T: ?Sized> RefCell<T> { unsafe impl<T: ?Sized> Send for RefCell<T> where T: Send {} #[stable(feature = "rust1", since = "1.0.0")] +impl<T: ?Sized> !Sync for RefCell<T> {} + +#[stable(feature = "rust1", since = "1.0.0")] impl<T: Clone> Clone for RefCell<T> { #[inline] fn clone(&self) -> RefCell<T> { diff --git a/src/libstd/sync/mpsc/mod.rs b/src/libstd/sync/mpsc/mod.rs index fadca390986..dbcc2bc95bc 100644 --- a/src/libstd/sync/mpsc/mod.rs +++ b/src/libstd/sync/mpsc/mod.rs @@ -299,6 +299,9 @@ pub struct Receiver<T> { #[stable(feature = "rust1", since = "1.0.0")] unsafe impl<T: Send> Send for Receiver<T> { } +#[stable(feature = "rust1", since = "1.0.0")] +impl<T> !Sync for Receiver<T> { } + /// An iterator over messages on a receiver, this iterator will block /// whenever `next` is called, waiting for a new message, and `None` will be /// returned when the corresponding channel has hung up. @@ -327,6 +330,9 @@ pub struct Sender<T> { #[stable(feature = "rust1", since = "1.0.0")] unsafe impl<T: Send> Send for Sender<T> { } +#[stable(feature = "rust1", since = "1.0.0")] +impl<T> !Sync for Sender<T> { } + /// The sending-half of Rust's synchronous channel type. This half can only be /// owned by one thread, but it can be cloned to send to other threads. #[stable(feature = "rust1", since = "1.0.0")] diff --git a/src/test/compile-fail/comm-not-freeze-receiver.rs b/src/test/compile-fail/comm-not-freeze-receiver.rs deleted file mode 100644 index 305acfec401..00000000000 --- a/src/test/compile-fail/comm-not-freeze-receiver.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::sync::mpsc::Receiver; - -fn test<T: Sync>() {} - -fn main() { - test::<Receiver<isize>>(); //~ ERROR: `core::marker::Sync` is not implemented -} diff --git a/src/test/compile-fail/comm-not-freeze.rs b/src/test/compile-fail/comm-not-freeze.rs deleted file mode 100644 index de2c96920c3..00000000000 --- a/src/test/compile-fail/comm-not-freeze.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::sync::mpsc::Sender; - -fn test<T: Sync>() {} - -fn main() { - test::<Sender<isize>>(); //~ ERROR: `core::marker::Sync` is not implemented -} diff --git a/src/test/compile-fail/no_share-rc.rs b/src/test/compile-fail/no_share-rc.rs deleted file mode 100644 index 4bc3442871f..00000000000 --- a/src/test/compile-fail/no_share-rc.rs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or -// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license -// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use std::rc::Rc; -use std::cell::RefCell; - -fn bar<T: Sync>(_: T) {} - -fn main() { - let x = Rc::new(RefCell::new(5)); - bar(x); - //~^ ERROR the trait `core::marker::Sync` is not implemented -} diff --git a/src/test/compile-fail/not-sync.rs b/src/test/compile-fail/not-sync.rs new file mode 100644 index 00000000000..a60138c6e1f --- /dev/null +++ b/src/test/compile-fail/not-sync.rs @@ -0,0 +1,34 @@ +// Copyright 2016 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +use std::cell::{Cell, RefCell}; +use std::rc::{Rc, Weak}; +use std::sync::mpsc::{Receiver, Sender, SyncSender}; + +fn test<T: Sync>() {} + +fn main() { + test::<Cell<i32>>(); + //~^ ERROR marker::Sync` is not implemented for the type `core::cell::Cell<i32>` + test::<RefCell<i32>>(); + //~^ ERROR marker::Sync` is not implemented for the type `core::cell::RefCell<i32>` + + test::<Rc<i32>>(); + //~^ ERROR marker::Sync` is not implemented for the type `alloc::rc::Rc<i32>` + test::<Weak<i32>>(); + //~^ ERROR marker::Sync` is not implemented for the type `alloc::rc::Weak<i32>` + + test::<Receiver<i32>>(); + //~^ ERROR marker::Sync` is not implemented for the type `std::sync::mpsc::Receiver<i32>` + test::<Sender<i32>>(); + //~^ ERROR marker::Sync` is not implemented for the type `std::sync::mpsc::Sender<i32>` + test::<SyncSender<i32>>(); + //~^ ERROR marker::Sync` is not implemented for the type `std::sync::mpsc::SyncSender<i32>` +} |
