]> git.lizzy.rs Git - rust.git/blob - tests/ui/rfcs/rfc1623.rs
Rollup merge of #104252 - faern:stabilize-const_socketaddr, r=JohnTitor
[rust.git] / tests / ui / rfcs / rfc1623.rs
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
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
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
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
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 }