summaryrefslogtreecommitdiffstats
path: root/tests/ui/regions/regions-bounded-by-trait-requiring-static.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/regions/regions-bounded-by-trait-requiring-static.rs')
-rw-r--r--tests/ui/regions/regions-bounded-by-trait-requiring-static.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/tests/ui/regions/regions-bounded-by-trait-requiring-static.rs b/tests/ui/regions/regions-bounded-by-trait-requiring-static.rs
new file mode 100644
index 000000000..7d02a4619
--- /dev/null
+++ b/tests/ui/regions/regions-bounded-by-trait-requiring-static.rs
@@ -0,0 +1,69 @@
+// Test which of the builtin types are considered sendable. The tests
+// in this file all test region bound and lifetime violations that are
+// detected during type check.
+
+trait Dummy : 'static { }
+fn assert_send<T:'static>() { }
+
+// lifetime pointers with 'static lifetime are ok
+
+fn static_lifime_ok<'a,T,U:Send>(_: &'a isize) {
+ assert_send::<&'static isize>();
+ assert_send::<&'static str>();
+ assert_send::<&'static [isize]>();
+
+ // whether or not they are mutable
+ assert_send::<&'static mut isize>();
+}
+
+// otherwise lifetime pointers are not ok
+
+fn param_not_ok<'a>(x: &'a isize) {
+ assert_send::<&'a isize>();
+ //~^ ERROR lifetime may not live long enough
+}
+
+fn param_not_ok1<'a>(_: &'a isize) {
+ assert_send::<&'a str>();
+ //~^ ERROR lifetime may not live long enough
+}
+
+fn param_not_ok2<'a>(_: &'a isize) {
+ assert_send::<&'a [isize]>();
+ //~^ ERROR lifetime may not live long enough
+}
+
+// boxes are ok
+
+fn box_ok() {
+ assert_send::<Box<isize>>();
+ assert_send::<String>();
+ assert_send::<Vec<isize>>();
+}
+
+// but not if they own a bad thing
+
+fn box_with_region_not_ok<'a>() {
+ assert_send::<Box<&'a isize>>();
+ //~^ ERROR lifetime may not live long enough
+}
+
+// raw pointers are ok unless they point at unsendable things
+
+fn unsafe_ok1<'a>(_: &'a isize) {
+ assert_send::<*const isize>();
+ assert_send::<*mut isize>();
+}
+
+fn unsafe_ok2<'a>(_: &'a isize) {
+ assert_send::<*const &'a isize>();
+ //~^ ERROR lifetime may not live long enough
+}
+
+fn unsafe_ok3<'a>(_: &'a isize) {
+ assert_send::<*mut &'a isize>();
+ //~^ ERROR lifetime may not live long enough
+}
+
+fn main() {
+}