about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-12-22 18:21:34 -0800
committerbors <bors@rust-lang.org>2013-12-22 18:21:34 -0800
commit57724012ff4bc48e362102b30113359c2f45c28d (patch)
treebd2d901f389ad4d9cb0d30c1d5a92f45761386a0 /src
parent1b4bbc89b3ce40dc95abec688c322fef798292f1 (diff)
parent67c02222526d46875ddabfda1b7a936564f916ff (diff)
auto merge of #11111 : alexcrichton/rust/issue-11039, r=brson
None of these primitives should be Freeze because sharing them in an Arc is a
very bad idea.

Closes #11039
Diffstat (limited to 'src')
-rw-r--r--src/libstd/comm/mod.rs4
-rw-r--r--src/test/compile-fail/comm-not-freeze.rs17
2 files changed, 21 insertions, 0 deletions
diff --git a/src/libstd/comm/mod.rs b/src/libstd/comm/mod.rs
index 4cbc6c7cbb7..30324d9bc60 100644
--- a/src/libstd/comm/mod.rs
+++ b/src/libstd/comm/mod.rs
@@ -292,6 +292,7 @@ impl<T: Send> Consumer<T>{
 
 /// The receiving-half of Rust's channel type. This half can only be owned by
 /// one task
+#[no_freeze] // can't share ports in an arc
 pub struct Port<T> {
     priv queue: Consumer<T>,
 }
@@ -305,12 +306,15 @@ pub struct PortIterator<'a, T> {
 
 /// The sending-half of Rust's channel type. This half can only be owned by one
 /// task
+#[no_freeze] // can't share chans in an arc
 pub struct Chan<T> {
     priv queue: spsc::Producer<T, Packet>,
 }
 
 /// The sending-half of Rust's channel type. This half can be shared among many
 /// tasks by creating copies of itself through the `clone` method.
+#[no_freeze] // technically this implementation is shareable, but it shouldn't
+             // be required to be shareable in an arc
 pub struct SharedChan<T> {
     priv queue: mpsc::Producer<T, Packet>,
 }
diff --git a/src/test/compile-fail/comm-not-freeze.rs b/src/test/compile-fail/comm-not-freeze.rs
new file mode 100644
index 00000000000..2b85068d470
--- /dev/null
+++ b/src/test/compile-fail/comm-not-freeze.rs
@@ -0,0 +1,17 @@
+// 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.
+
+fn test<T: Freeze>() {}
+
+fn main() {
+    test::<Chan<int>>();        //~ ERROR: does not fulfill `Freeze`
+    test::<Port<int>>();        //~ ERROR: does not fulfill `Freeze`
+    test::<SharedChan<int>>();  //~ ERROR: does not fulfill `Freeze`
+}