1 // run-pass
2 #![allow(unused_variables)]
3 #![allow(non_upper_case_globals)]
4
5 #![allow(dead_code)]
6
7 // very simple test for a 'static static with default lifetime
8 static STATIC_STR: &str = "&'static str";
9 const CONST_STR: &str = "&'static str";
10
11 // this should be the same as without default:
12 static EXPLICIT_STATIC_STR: &'static str = "&'static str";
13 const EXPLICIT_CONST_STR: &'static str = "&'static str";
14
15 // a function that elides to an unbound lifetime for both in- and output
id_u8_slice(arg: &[u8]) -> &[u8]16 fn id_u8_slice(arg: &[u8]) -> &[u8] {
17 arg
18 }
19
20 // one with a function, argument elided
21 static STATIC_SIMPLE_FN: &fn(&[u8]) -> &[u8] = &(id_u8_slice as fn(&[u8]) -> &[u8]);
22 const CONST_SIMPLE_FN: &fn(&[u8]) -> &[u8] = &(id_u8_slice as fn(&[u8]) -> &[u8]);
23
24 // this should be the same as without elision
25 static STATIC_NON_ELIDED_fN: &for<'a> fn(&'a [u8]) -> &'a [u8] =
26 &(id_u8_slice as for<'a> fn(&'a [u8]) -> &'a [u8]);
27 const CONST_NON_ELIDED_fN: &for<'a> fn(&'a [u8]) -> &'a [u8] =
28 &(id_u8_slice as for<'a> fn(&'a [u8]) -> &'a [u8]);
29
30 // another function that elides, each to a different unbound lifetime
multi_args(a: &u8, b: &u8, c: &u8)31 fn multi_args(a: &u8, b: &u8, c: &u8) {}
32
33 static STATIC_MULTI_FN: &fn(&u8, &u8, &u8) = &(multi_args as fn(&u8, &u8, &u8));
34 const CONST_MULTI_FN: &fn(&u8, &u8, &u8) = &(multi_args as fn(&u8, &u8, &u8));
35
36 struct Foo<'a> {
37 bools: &'a [bool],
38 }
39
40 static STATIC_FOO: Foo = Foo { bools: &[true, false] };
41 const CONST_FOO: Foo = Foo { bools: &[true, false] };
42
43 type Bar<'a> = Foo<'a>;
44
45 static STATIC_BAR: Bar = Bar { bools: &[true, false] };
46 const CONST_BAR: Bar = Bar { bools: &[true, false] };
47
48 type Baz<'a> = fn(&'a [u8]) -> Option<u8>;
49
baz(e: &[u8]) -> Option<u8>50 fn baz(e: &[u8]) -> Option<u8> {
51 e.first().map(|x| *x)
52 }
53
54 static STATIC_BAZ: &Baz = &(baz as Baz);
55 const CONST_BAZ: &Baz = &(baz as Baz);
56
57 static BYTES: &[u8] = &[1, 2, 3];
58
main()59 fn main() {
60 // make sure that the lifetime is actually elided (and not defaulted)
61 let x = &[1u8, 2, 3];
62 STATIC_SIMPLE_FN(x);
63 CONST_SIMPLE_FN(x);
64
65 STATIC_BAZ(BYTES); // neees static lifetime
66 CONST_BAZ(BYTES);
67
68 // make sure this works with different lifetimes
69 let a = &1;
70 {
71 let b = &2;
72 let c = &3;
73 CONST_MULTI_FN(a, b, c);
74 }
75 }
76