File tree Expand file tree Collapse file tree 2 files changed +99
-0
lines changed
src/test/ui/rfc-2093-infer-outlives Expand file tree Collapse file tree 2 files changed +99
-0
lines changed Original file line number Diff line number Diff line change 1+ // Sanity check that `PhantomData<&'a T>` infers `T: 'a`.
2+
3+ use std:: marker:: PhantomData ;
4+ use std:: ptr;
5+
6+ struct InferredBound < ' a , T > {
7+ ptr : * const T ,
8+ phantom : PhantomData < & ' a T > ,
9+ }
10+
11+ struct RedundantBound < ' a , T : ' a > {
12+ ptr : * const T ,
13+ phantom : PhantomData < & ' a T > ,
14+ }
15+
16+ struct ManualBound < ' a , T : ' a > {
17+ ptr : * const T ,
18+ phantom : PhantomData < & ' a ( ) > ,
19+ }
20+
21+ struct NoBound < ' a , T > {
22+ ptr : * const T ,
23+ phantom : PhantomData < & ' a ( ) > ,
24+ }
25+
26+ fn inferred_bound < ' a > ( _: & ' a u8 ) -> InferredBound < ' static , & ' a u8 > {
27+ InferredBound {
28+ ptr : ptr:: null ( ) ,
29+ phantom : PhantomData ,
30+ }
31+ }
32+
33+ fn redundant_bound < ' a > ( _: & ' a u8 ) -> RedundantBound < ' static , & ' a u8 > {
34+ RedundantBound {
35+ ptr : ptr:: null ( ) ,
36+ phantom : PhantomData ,
37+ }
38+ }
39+
40+ fn manual_bound < ' a > ( _: & ' a u8 ) -> ManualBound < ' static , & ' a u8 > {
41+ ManualBound {
42+ ptr : ptr:: null ( ) ,
43+ phantom : PhantomData ,
44+ }
45+ }
46+
47+ fn no_bound < ' a > ( _: & ' a u8 ) -> NoBound < ' static , & ' a u8 > {
48+ NoBound {
49+ ptr : ptr:: null ( ) ,
50+ phantom : PhantomData ,
51+ }
52+ }
53+
54+ fn main ( ) {
55+ let local = 0 ;
56+ inferred_bound ( & local) ; //~ ERROR: `local` does not live long enough [E0597]
57+ redundant_bound ( & local) ; //~ ERROR: `local` does not live long enough [E0597]
58+ manual_bound ( & local) ; //~ ERROR: `local` does not live long enough [E0597]
59+ no_bound ( & local) ; // OK
60+ }
Original file line number Diff line number Diff line change 1+ error[E0597]: `local` does not live long enough
2+ --> $DIR/phatom-data.rs:56:20
3+ |
4+ LL | inferred_bound(&local);
5+ | ---------------^^^^^^-
6+ | | |
7+ | | borrowed value does not live long enough
8+ | argument requires that `local` is borrowed for `'static`
9+ ...
10+ LL | }
11+ | - `local` dropped here while still borrowed
12+
13+ error[E0597]: `local` does not live long enough
14+ --> $DIR/phatom-data.rs:57:21
15+ |
16+ LL | redundant_bound(&local);
17+ | ----------------^^^^^^-
18+ | | |
19+ | | borrowed value does not live long enough
20+ | argument requires that `local` is borrowed for `'static`
21+ ...
22+ LL | }
23+ | - `local` dropped here while still borrowed
24+
25+ error[E0597]: `local` does not live long enough
26+ --> $DIR/phatom-data.rs:58:18
27+ |
28+ LL | manual_bound(&local);
29+ | -------------^^^^^^-
30+ | | |
31+ | | borrowed value does not live long enough
32+ | argument requires that `local` is borrowed for `'static`
33+ LL | no_bound(&local); // OK
34+ LL | }
35+ | - `local` dropped here while still borrowed
36+
37+ error: aborting due to 3 previous errors
38+
39+ For more information about this error, try `rustc --explain E0597`.
You can’t perform that action at this time.
0 commit comments