diff options
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/compile-fail/kindck-freeze.rs | 56 | ||||
| -rw-r--r-- | src/test/compile-fail/kindck-send.rs | 59 | ||||
| -rw-r--r-- | src/test/compile-fail/mutable-enum-indirect.rs | 12 |
3 files changed, 127 insertions, 0 deletions
diff --git a/src/test/compile-fail/kindck-freeze.rs b/src/test/compile-fail/kindck-freeze.rs new file mode 100644 index 00000000000..c83892e2a3b --- /dev/null +++ b/src/test/compile-fail/kindck-freeze.rs @@ -0,0 +1,56 @@ +// Copyright 2012 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. + +// Test which of the builtin types are considered freezeable. + +fn assert_freeze<T:Freeze>() { } +trait Dummy { } + +fn test<'a,T,U:Freeze>(_: &'a int) { + // lifetime pointers are ok... + assert_freeze::<&'static int>(); + assert_freeze::<&'a int>(); + assert_freeze::<&'a str>(); + assert_freeze::<&'a [int]>(); + + // ...unless they are mutable + assert_freeze::<&'static mut int>(); //~ ERROR does not fulfill `Freeze` + assert_freeze::<&'a mut int>(); //~ ERROR does not fulfill `Freeze` + + // ~ pointers are ok + assert_freeze::<~int>(); + assert_freeze::<~str>(); + assert_freeze::<~[int]>(); + + // but not if they own a bad thing + assert_freeze::<~&'a mut int>(); //~ ERROR does not fulfill `Freeze` + + // careful with object types, who knows what they close over... + assert_freeze::<&'a Dummy>(); //~ ERROR does not fulfill `Freeze` + assert_freeze::<~Dummy>(); //~ ERROR does not fulfill `Freeze` + + // ...unless they are properly bounded + assert_freeze::<&'a Dummy:Freeze>(); + assert_freeze::<&'static Dummy:Freeze>(); + assert_freeze::<~Dummy:Freeze>(); + + // ...but even then the pointer overrides + assert_freeze::<&'a mut Dummy:Freeze>(); //~ ERROR does not fulfill `Freeze` + + // closures are like an `&mut` object + assert_freeze::<&fn()>(); //~ ERROR does not fulfill `Freeze` + + // unsafe ptrs are ok unless they point at unfreezeable things + assert_freeze::<*int>(); + assert_freeze::<*&'a mut int>(); //~ ERROR does not fulfill `Freeze` +} + +fn main() { +} diff --git a/src/test/compile-fail/kindck-send.rs b/src/test/compile-fail/kindck-send.rs new file mode 100644 index 00000000000..bb5851ac5c8 --- /dev/null +++ b/src/test/compile-fail/kindck-send.rs @@ -0,0 +1,59 @@ +// Copyright 2012 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. + +// Test which of the builtin types are considered sendable. + +fn assert_send<T:Send>() { } +trait Dummy { } + +fn test<'a,T,U:Send>(_: &'a int) { + // lifetime pointers with 'static lifetime are ok + assert_send::<&'static int>(); + assert_send::<&'static str>(); + assert_send::<&'static [int]>(); + + // whether or not they are mutable + assert_send::<&'static mut int>(); + + // otherwise lifetime pointers are not ok + assert_send::<&'a int>(); //~ ERROR does not fulfill `Send` + assert_send::<&'a str>(); //~ ERROR does not fulfill `Send` + assert_send::<&'a [int]>(); //~ ERROR does not fulfill `Send` + + // ~ pointers are ok + assert_send::<~int>(); + assert_send::<~str>(); + assert_send::<~[int]>(); + + // but not if they own a bad thing + assert_send::<~&'a int>(); //~ ERROR does not fulfill `Send` + + // careful with object types, who knows what they close over... + assert_send::<&'static Dummy>(); //~ ERROR does not fulfill `Send` + assert_send::<&'a Dummy>(); //~ ERROR does not fulfill `Send` + assert_send::<&'a Dummy:Send>(); //~ ERROR does not fulfill `Send` + assert_send::<~Dummy:>(); //~ ERROR does not fulfill `Send` + + // ...unless they are properly bounded + assert_send::<&'static Dummy:Send>(); + assert_send::<~Dummy:Send>(); + + // but closure and object types can have lifetime bounds which make + // them not ok (FIXME #5121) + // assert_send::<~fn:'a()>(); // ERROR does not fulfill `Send` + // assert_send::<~Dummy:'a>(); // ERROR does not fulfill `Send` + + // unsafe ptrs are ok unless they point at unsendable things + assert_send::<*int>(); + assert_send::<*&'a int>(); //~ ERROR does not fulfill `Send` +} + +fn main() { +} diff --git a/src/test/compile-fail/mutable-enum-indirect.rs b/src/test/compile-fail/mutable-enum-indirect.rs new file mode 100644 index 00000000000..9fad05387c6 --- /dev/null +++ b/src/test/compile-fail/mutable-enum-indirect.rs @@ -0,0 +1,12 @@ +// Tests that an `&` pointer to something inherently mutable is itself +// to be considered mutable. + +#[no_freeze] +enum Foo { A } + +fn bar<T: Freeze>(_: T) {} + +fn main() { + let x = A; + bar(&x); //~ ERROR type parameter with an incompatible type +} |
