about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/compile-fail/rfc1623.rs17
-rw-r--r--src/test/run-pass/rfc1623.rs50
2 files changed, 51 insertions, 16 deletions
diff --git a/src/test/compile-fail/rfc1623.rs b/src/test/compile-fail/rfc1623.rs
index a52b9c596aa..840307ea456 100644
--- a/src/test/compile-fail/rfc1623.rs
+++ b/src/test/compile-fail/rfc1623.rs
@@ -13,10 +13,21 @@
 fn non_elidable<'a, 'b>(a: &'a u8, b: &'b u8) -> &'a u8 { a }
 
 // the boundaries of elision
-static NON_ELIDABLE_FN : &fn(&u8, &u8) -> &u8 = 
-//~^ERROR: missing lifetime specifier
+static NON_ELIDABLE_FN : &fn(&u8, &u8) -> &u8 =
+//^ERROR: missing lifetime specifier
         &(non_elidable as fn(&u8, &u8) -> &u8);
 
+type Baz<'a> = fn(&'a [u8]) -> Option<u8>;
+
+fn baz(e: &[u8]) -> Option<u8> { e.first().map(|x| *x) }
+
+static STATIC_BAZ : &Baz<'static> = &(baz as Baz);
+const CONST_BAZ : &Baz<'static> = &(baz as Baz);
+
 fn main() {
-    // nothing to do here
+    let y = [1u8, 2, 3];
+
+    //surprisingly this appears to work, so lifetime < `'static` is valid
+    assert_eq!(Some(1), STATIC_BAZ(y));
+    assert_eq!(Some(1), CONST_BAZ(y));
 }
diff --git a/src/test/run-pass/rfc1623.rs b/src/test/run-pass/rfc1623.rs
index 81e32efe6c7..bd0420bb506 100644
--- a/src/test/run-pass/rfc1623.rs
+++ b/src/test/run-pass/rfc1623.rs
@@ -11,48 +11,72 @@
 #![allow(dead_code)]
 
 // very simple test for a 'static static with default lifetime
-static SOME_STATIC_STR : &str = "&'static str";
-const SOME_CONST_STR : &str = "&'static str";
+static STATIC_STR : &str = "&'static str";
+const CONST_STR : &str = "&'static str";
 
 // this should be the same as without default:
-static SOME_EXPLICIT_STATIC_STR : &'static str = "&'static str";
-const SOME_EXPLICIT_CONST_STR : &'static str = "&'static str";
+static EXPLICIT_STATIC_STR : &'static str = "&'static str";
+const EXPLICIT_CONST_STR : &'static str = "&'static str";
 
 // a function that elides to an unbound lifetime for both in- and output
 fn id_u8_slice(arg: &[u8]) -> &[u8] { arg }
 
 // one with a function, argument elided
-static SOME_STATIC_SIMPLE_FN : &fn(&[u8]) -> &[u8] =
+static STATIC_SIMPLE_FN : &fn(&[u8]) -> &[u8] =
         &(id_u8_slice as fn(&[u8]) -> &[u8]);
-const SOME_CONST_SIMPLE_FN : &fn(&[u8]) -> &[u8] =
+const CONST_SIMPLE_FN : &fn(&[u8]) -> &[u8] =
         &(id_u8_slice as fn(&[u8]) -> &[u8]);
 
 // this should be the same as without elision
-static SOME_STATIC_NON_ELIDED_fN : &for<'a> fn(&'a [u8]) -> &'a [u8] =
+static STATIC_NON_ELIDED_fN : &for<'a> fn(&'a [u8]) -> &'a [u8] =
         &(id_u8_slice as for<'a> fn(&'a [u8]) -> &'a [u8]);
-const SOME_CONST_NON_ELIDED_fN : &for<'a> fn(&'a [u8]) -> &'a [u8] =
+const CONST_NON_ELIDED_fN : &for<'a> fn(&'a [u8]) -> &'a [u8] =
         &(id_u8_slice as for<'a> fn(&'a [u8]) -> &'a [u8]);
 
 // another function that elides, each to a different unbound lifetime
 fn multi_args(a: &u8, b: &u8, c: &u8) { }
 
-static SOME_STATIC_MULTI_FN : &fn(&u8, &u8, &u8) =
+static STATIC_MULTI_FN : &fn(&u8, &u8, &u8) =
         &(multi_args as fn(&u8, &u8, &u8));
-const SOME_CONST_MULTI_FN : &fn(&u8, &u8, &u8) =
+const CONST_MULTI_FN : &fn(&u8, &u8, &u8) =
         &(multi_args as fn(&u8, &u8, &u8));
 
+struct Foo<'a> {
+    bools: &'a [bool]
+}
+
+static STATIC_FOO : Foo = Foo { bools: &[true, false] };
+const CONST_FOO : Foo = Foo { bools: &[true, false] };
+
+type Bar<'a> = Foo<'a>;
+
+static STATIC_BAR : Bar = Bar { bools: &[true, false] };
+const CONST_BAR : Bar = Bar { bools: &[true, false] };
+
+type Baz<'a> = fn(&'a [u8]) -> Option<u8>;
+
+fn baz(e: &[u8]) -> Option<u8> { e.first().map(|x| *x) }
+
+static STATIC_BAZ : &Baz = &(baz as Baz);
+const CONST_BAZ : &Baz = &(baz as Baz);
+
+static BYTES : &[u8] = &[1, 2, 3];
 
 fn main() {
     // make sure that the lifetime is actually elided (and not defaulted)
     let x = &[1u8, 2, 3];
-    SOME_STATIC_SIMPLE_FN(x);
-    SOME_CONST_SIMPLE_FN(x);
+    STATIC_SIMPLE_FN(x);
+    CONST_SIMPLE_FN(x);
+
+    let y = &[1u8, 2, 3];
+    STATIC_BAZ(BYTES);
+    //CONST_BAZ(y); // strangely enough, this fails
 
     // make sure this works with different lifetimes
     let a = &1;
     {
         let b = &2;
         let c = &3;
-        SOME_CONST_MULTI_FN(a, b, c);
+        CONST_MULTI_FN(a, b, c);
     }
 }