Skip to content

Commit dd8f02c

Browse files
committed
Suggest 'r instead of 'lifetime
1 parent d861bd4 commit dd8f02c

19 files changed

+120
-59
lines changed

src/librustc_resolve/diagnostics.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1493,8 +1493,8 @@ crate fn add_missing_lifetime_specifiers_label(
14931493
msg = "consider introducing a named lifetime parameter";
14941494
should_break = true;
14951495
match &generics.params {
1496-
[] => (generics.span, "<'lifetime>".to_string()),
1497-
[param, ..] => (param.span.shrink_to_lo(), "'lifetime, ".to_string()),
1496+
[] => (generics.span, "<'r>".to_string()),
1497+
[param, ..] => (param.span.shrink_to_lo(), "'r, ".to_string()),
14981498
}
14991499
}
15001500
MissingLifetimeSpot::HRLT { span, span_type } => {
@@ -1505,8 +1505,8 @@ crate fn add_missing_lifetime_specifiers_label(
15051505
https://doc.rust-lang.org/nomicon/hrtb.html",
15061506
);
15071507
let suggestion = match span_type {
1508-
HRLTSpanType::Empty => "for<'lifetime> ",
1509-
HRLTSpanType::Tail => ", 'lifetime",
1508+
HRLTSpanType::Empty => "for<'r> ",
1509+
HRLTSpanType::Tail => ", 'r",
15101510
};
15111511
(*span, suggestion.to_string())
15121512
}
@@ -1515,7 +1515,7 @@ crate fn add_missing_lifetime_specifiers_label(
15151515
if let Ok(snippet) = source_map.span_to_snippet(param.span) {
15161516
if snippet.starts_with("&") && !snippet.starts_with("&'") {
15171517
introduce_suggestion
1518-
.push((param.span, format!("&'lifetime {}", &snippet[1..])));
1518+
.push((param.span, format!("&'r {}", &snippet[1..])));
15191519
}
15201520
}
15211521
}
@@ -1538,13 +1538,13 @@ crate fn add_missing_lifetime_specifiers_label(
15381538
suggest_existing(err, format!("{}<{}>", snippet, name));
15391539
}
15401540
(0, _, Some("&")) => {
1541-
suggest_new(err, "&'lifetime ");
1541+
suggest_new(err, "&'r ");
15421542
}
15431543
(0, _, Some("'_")) => {
1544-
suggest_new(err, "'lifetime");
1544+
suggest_new(err, "'r");
15451545
}
15461546
(0, _, Some(snippet)) if !snippet.ends_with(">") => {
1547-
suggest_new(err, &format!("{}<'lifetime>", snippet));
1547+
suggest_new(err, &format!("{}<'r>", snippet));
15481548
}
15491549
_ => {
15501550
err.span_label(span, "expected lifetime parameter");

src/test/ui/error-codes/E0106.stderr

+8-8
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | x: &bool,
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | struct Foo<'lifetime> {
10-
LL | x: &'lifetime bool,
9+
LL | struct Foo<'r> {
10+
LL | x: &'r bool,
1111
|
1212

1313
error[E0106]: missing lifetime specifier
@@ -18,9 +18,9 @@ LL | B(&bool),
1818
|
1919
help: consider introducing a named lifetime parameter
2020
|
21-
LL | enum Bar<'lifetime> {
21+
LL | enum Bar<'r> {
2222
LL | A(u8),
23-
LL | B(&'lifetime bool),
23+
LL | B(&'r bool),
2424
|
2525

2626
error[E0106]: missing lifetime specifier
@@ -31,8 +31,8 @@ LL | type MyStr = &str;
3131
|
3232
help: consider introducing a named lifetime parameter
3333
|
34-
LL | type MyStr<'lifetime> = &'lifetime str;
35-
| ^^^^^^^^^^^ ^^^^^^^^^^
34+
LL | type MyStr<'r> = &'r str;
35+
| ^^^^ ^^^
3636

3737
error[E0106]: missing lifetime specifier
3838
--> $DIR/E0106.rs:17:10
@@ -42,8 +42,8 @@ LL | baz: Baz,
4242
|
4343
help: consider introducing a named lifetime parameter
4444
|
45-
LL | struct Quux<'lifetime> {
46-
LL | baz: Baz<'lifetime>,
45+
LL | struct Quux<'r> {
46+
LL | baz: Baz<'r>,
4747
|
4848

4949
error[E0106]: missing lifetime specifiers

src/test/ui/impl-header-lifetime-elision/assoc-type.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | type Output = &i32;
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | type Output<'lifetime> = &'lifetime i32;
10-
| ^^^^^^^^^^^ ^^^^^^^^^^
9+
LL | type Output<'r> = &'r i32;
10+
| ^^^^ ^^^
1111

1212
error[E0106]: missing lifetime specifier
1313
--> $DIR/assoc-type.rs:16:20
@@ -17,8 +17,8 @@ LL | type Output = &'_ i32;
1717
|
1818
help: consider introducing a named lifetime parameter
1919
|
20-
LL | type Output<'lifetime> = &'lifetime i32;
21-
| ^^^^^^^^^^^ ^^^^^^^^^
20+
LL | type Output<'r> = &'r i32;
21+
| ^^^^ ^^
2222

2323
error: aborting due to 2 previous errors
2424

src/test/ui/in-band-lifetimes/issue-61124-anon-lifetime-in-struct-declaration.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | struct Heartbreak(Betrayal);
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | struct Heartbreak<'lifetime>(Betrayal<'lifetime>);
10-
| ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^
9+
LL | struct Heartbreak<'r>(Betrayal<'r>);
10+
| ^^^^ ^^^^^^^^^^^^
1111

1212
error: aborting due to previous error
1313

src/test/ui/issues/issue-19707.stderr

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ LL | type Foo = fn(&u8, &u8) -> &u8;
1111
| ^^^ ^^^
1212
help: consider introducing a named lifetime parameter
1313
|
14-
LL | type Foo<'lifetime> = fn(&'lifetime u8, &'lifetime u8) -> &'lifetime u8;
15-
| ^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^
14+
LL | type Foo<'r> = fn(&'r u8, &'r u8) -> &'r u8;
15+
| ^^^^ ^^^^^^ ^^^^^^ ^^^
1616

1717
error[E0106]: missing lifetime specifier
1818
--> $DIR/issue-19707.rs:5:27
@@ -28,12 +28,12 @@ LL | fn bar<F: Fn(&u8, &u8) -> &u8>(f: &F) {}
2828
= note: for more information on Higher-Ranked lifetimes, visit https://doc.rust-lang.org/nomicon/hrtb.html
2929
help: consider introducing a Higher-Ranked lifetime
3030
|
31-
LL | fn bar<F: for<'lifetime> Fn(&'lifetime u8, &'lifetime u8) -> &'lifetime u8>(f: &F) {}
32-
| ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^
31+
LL | fn bar<F: for<'r> Fn(&'r u8, &'r u8) -> &'r u8>(f: &F) {}
32+
| ^^^^^^^ ^^^^^^ ^^^^^^ ^^^
3333
help: consider introducing a named lifetime parameter
3434
|
35-
LL | fn bar<'lifetime, F: Fn(&'lifetime u8, &'lifetime u8) -> &'lifetime u8>(f: &F) {}
36-
| ^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^^^^ ^^^^^^^^^^
35+
LL | fn bar<'r, F: Fn(&'r u8, &'r u8) -> &'r u8>(f: &F) {}
36+
| ^^^ ^^^^^^ ^^^^^^ ^^^
3737

3838
error: aborting due to 2 previous errors
3939

src/test/ui/issues/issue-26638.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ LL | fn parse_type(iter: Box<dyn Iterator<Item=&str>+'static>) -> &str { iter.ne
1111
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1212
help: consider introducing a named lifetime parameter
1313
|
14-
LL | fn parse_type<'lifetime>(iter: Box<dyn Iterator<Item=&str>+'static>) -> &'lifetime str { iter.next() }
15-
| ^^^^^^^^^^^ ^^^^^^^^^^
14+
LL | fn parse_type<'r>(iter: Box<dyn Iterator<Item=&str>+'static>) -> &'r str { iter.next() }
15+
| ^^^^ ^^^
1616

1717
error[E0106]: missing lifetime specifier
1818
--> $DIR/issue-26638.rs:4:40

src/test/ui/issues/issue-30255.stderr

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ LL | fn f(a: &S, b: i32) -> &i32 {
1111
| ^^
1212
help: consider introducing a named lifetime parameter
1313
|
14-
LL | fn f<'lifetime>(a: &'lifetime S, b: i32) -> &'lifetime i32 {
15-
| ^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^
14+
LL | fn f<'r>(a: &'r S, b: i32) -> &'r i32 {
15+
| ^^^^ ^^^^^ ^^^
1616

1717
error[E0106]: missing lifetime specifier
1818
--> $DIR/issue-30255.rs:14:34
@@ -27,8 +27,8 @@ LL | fn g(a: &S, b: bool, c: &i32) -> &i32 {
2727
| ^^ ^^^^
2828
help: consider introducing a named lifetime parameter
2929
|
30-
LL | fn g<'lifetime>(a: &'lifetime S, b: bool, c: &'lifetime i32) -> &'lifetime i32 {
31-
| ^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^
30+
LL | fn g<'r>(a: &'r S, b: bool, c: &'r i32) -> &'r i32 {
31+
| ^^^^ ^^^^^ ^^^^^^^ ^^^
3232

3333
error[E0106]: missing lifetime specifier
3434
--> $DIR/issue-30255.rs:19:44
@@ -43,8 +43,8 @@ LL | fn h(a: &bool, b: bool, c: &S, d: &i32) -> &i32 {
4343
| ^^^^^ ^^ ^^^^
4444
help: consider introducing a named lifetime parameter
4545
|
46-
LL | fn h<'lifetime>(a: &'lifetime bool, b: bool, c: &'lifetime S, d: &'lifetime i32) -> &'lifetime i32 {
47-
| ^^^^^^^^^^^ ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^
46+
LL | fn h<'r>(a: &'r bool, b: bool, c: &'r S, d: &'r i32) -> &'r i32 {
47+
| ^^^^ ^^^^^^^^ ^^^^^ ^^^^^^^ ^^^
4848

4949
error: aborting due to 3 previous errors
5050

src/test/ui/lifetimes/lifetime-elision-return-type-requires-explicit-lifetime.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ LL | fn g(_x: &isize, _y: &isize) -> &isize {
1919
| ^^^^^^ ^^^^^^
2020
help: consider introducing a named lifetime parameter
2121
|
22-
LL | fn g<'lifetime>(_x: &'lifetime isize, _y: &'lifetime isize) -> &'lifetime isize {
23-
| ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ ^^^^^^^^^^
22+
LL | fn g<'r>(_x: &'r isize, _y: &'r isize) -> &'r isize {
23+
| ^^^^ ^^^^^^^^^ ^^^^^^^^^ ^^^
2424

2525
error[E0106]: missing lifetime specifier
2626
--> $DIR/lifetime-elision-return-type-requires-explicit-lifetime.rs:17:19
@@ -35,8 +35,8 @@ LL | fn h(_x: &Foo) -> &isize {
3535
| ^^^^
3636
help: consider introducing a named lifetime parameter
3737
|
38-
LL | fn h<'lifetime>(_x: &'lifetime Foo) -> &'lifetime isize {
39-
| ^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^
38+
LL | fn h<'r>(_x: &'r Foo) -> &'r isize {
39+
| ^^^^ ^^^^^^^ ^^^
4040

4141
error[E0106]: missing lifetime specifier
4242
--> $DIR/lifetime-elision-return-type-requires-explicit-lifetime.rs:21:20

src/test/ui/lifetimes/lifetime-errors/ex1b-return-no-names-if-else.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ LL | fn foo(x: &i32, y: &i32) -> &i32 {
1111
| ^^^^ ^^^^
1212
help: consider introducing a named lifetime parameter
1313
|
14-
LL | fn foo<'lifetime>(x: &'lifetime i32, y: &'lifetime i32) -> &'lifetime i32 {
15-
| ^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^
14+
LL | fn foo<'r>(x: &'r i32, y: &'r i32) -> &'r i32 {
15+
| ^^^^ ^^^^^^^ ^^^^^^^ ^^^
1616

1717
error: aborting due to previous error
1818

src/test/ui/proc-macro/item-error.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | a: &u64
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | struct A<'lifetime> {
10-
LL | a: &'lifetime u64
9+
LL | struct A<'r> {
10+
LL | a: &'r u64
1111
|
1212

1313
error: aborting due to previous error

src/test/ui/regions/regions-in-enums-anon.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | Bar(&isize)
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | enum Foo<'lifetime> {
10-
LL | Bar(&'lifetime isize)
9+
LL | enum Foo<'r> {
10+
LL | Bar(&'r isize)
1111
|
1212

1313
error: aborting due to previous error

src/test/ui/regions/regions-in-structs-anon.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | x: &isize
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | struct Foo<'lifetime> {
10-
LL | x: &'lifetime isize
9+
LL | struct Foo<'r> {
10+
LL | x: &'r isize
1111
|
1212

1313
error: aborting due to previous error
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
struct S1<F: Fn(&i32, &i32) -> &'a i32>(F); //~ ERROR use of undeclared lifetime name `'a`
2+
struct S2<F: Fn(&i32, &i32) -> &i32>(F); //~ ERROR missing lifetime specifier
3+
struct S3<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
4+
//~^ ERROR binding for associated type `Output` references lifetime `'a`, which does not appear
5+
struct S4<F: for<'x> Fn(&'x i32, &'x i32) -> &'x i32>(F);
6+
const C: Option<Box<dyn for<'a> Fn(&usize, &usize) -> &'a usize>> = None;
7+
//~^ ERROR binding for associated type `Output` references lifetime `'a`, which does not appear
8+
fn main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
error[E0261]: use of undeclared lifetime name `'a`
2+
--> $DIR/fn-missing-lifetime-in-item.rs:1:33
3+
|
4+
LL | struct S1<F: Fn(&i32, &i32) -> &'a i32>(F);
5+
| ^^ undeclared lifetime
6+
|
7+
= note: for more information on Higher-Ranked lifetimes, visit https://doc.rust-lang.org/nomicon/hrtb.html
8+
help: consider introducing lifetime `'a` here
9+
|
10+
LL | struct S1<'a, F: Fn(&i32, &i32) -> &'a i32>(F);
11+
| ^^^
12+
help: consider introducing a Higher-Ranked lifetime `'a` here
13+
|
14+
LL | struct S1<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
15+
| ^^^^^^^
16+
17+
error[E0106]: missing lifetime specifier
18+
--> $DIR/fn-missing-lifetime-in-item.rs:2:32
19+
|
20+
LL | struct S2<F: Fn(&i32, &i32) -> &i32>(F);
21+
| ^ expected named lifetime parameter
22+
|
23+
help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from argument 1 or argument 2
24+
--> $DIR/fn-missing-lifetime-in-item.rs:2:17
25+
|
26+
LL | struct S2<F: Fn(&i32, &i32) -> &i32>(F);
27+
| ^^^^ ^^^^
28+
= note: for more information on Higher-Ranked lifetimes, visit https://doc.rust-lang.org/nomicon/hrtb.html
29+
help: consider introducing a Higher-Ranked lifetime
30+
|
31+
LL | struct S2<F: for<'r> Fn(&'r i32, &'r i32) -> &'r i32>(F);
32+
| ^^^^^^^ ^^^^^^^ ^^^^^^^ ^^^
33+
help: consider introducing a named lifetime parameter
34+
|
35+
LL | struct S2<'r, F: Fn(&'r i32, &'r i32) -> &'r i32>(F);
36+
| ^^^ ^^^^^^^ ^^^^^^^ ^^^
37+
38+
error[E0582]: binding for associated type `Output` references lifetime `'a`, which does not appear in the trait input types
39+
--> $DIR/fn-missing-lifetime-in-item.rs:3:40
40+
|
41+
LL | struct S3<F: for<'a> Fn(&i32, &i32) -> &'a i32>(F);
42+
| ^^^^^^^
43+
44+
error[E0582]: binding for associated type `Output` references lifetime `'a`, which does not appear in the trait input types
45+
--> $DIR/fn-missing-lifetime-in-item.rs:6:55
46+
|
47+
LL | const C: Option<Box<dyn for<'a> Fn(&usize, &usize) -> &'a usize>> = None;
48+
| ^^^^^^^^^
49+
50+
error: aborting due to 4 previous errors
51+
52+
Some errors have detailed explanations: E0106, E0261, E0582.
53+
For more information about an error, try `rustc --explain E0106`.

src/test/ui/unboxed-closures/unboxed-closure-sugar-lifetime-elision.stderr

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ LL | let _: dyn Foo(&isize, &usize) -> &usize;
1111
| ^^^^^^ ^^^^^^
1212
help: consider introducing a named lifetime parameter
1313
|
14-
LL | fn main<'lifetime>() {
14+
LL | fn main<'r>() {
1515
LL | eq::< dyn for<'a> Foo<(&'a isize,), Output=&'a isize>,
1616
LL | dyn Foo(&isize) -> &isize >();
1717
LL | eq::< dyn for<'a> Foo<(&'a isize,), Output=(&'a isize, &'a isize)>,

src/test/ui/underscore-lifetime/dyn-trait-underscore-in-struct.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | x: Box<dyn Debug + '_>,
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | struct Foo<'lifetime> {
10-
LL | x: Box<dyn Debug + 'lifetime>,
9+
LL | struct Foo<'r> {
10+
LL | x: Box<dyn Debug + 'r>,
1111
|
1212

1313
error[E0228]: the lifetime bound for this object type cannot be deduced from context; please supply an explicit bound

src/test/ui/underscore-lifetime/in-fn-return-illegal.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ LL | fn foo(x: &u32, y: &u32) -> &'_ u32 { loop { } }
1111
| ^^^^ ^^^^
1212
help: consider introducing a named lifetime parameter
1313
|
14-
LL | fn foo<'lifetime>(x: &'lifetime u32, y: &'lifetime u32) -> &'lifetime u32 { loop { } }
15-
| ^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^ ^^^^^^^^^
14+
LL | fn foo<'r>(x: &'r u32, y: &'r u32) -> &'r u32 { loop { } }
15+
| ^^^^ ^^^^^^^ ^^^^^^^ ^^
1616

1717
error: aborting due to previous error
1818

src/test/ui/underscore-lifetime/in-struct.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ LL | x: &'_ u32,
66
|
77
help: consider introducing a named lifetime parameter
88
|
9-
LL | struct Foo<'lifetime> {
10-
LL | x: &'lifetime u32,
9+
LL | struct Foo<'r> {
10+
LL | x: &'r u32,
1111
|
1212

1313
error[E0106]: missing lifetime specifier
@@ -18,8 +18,8 @@ LL | Variant(&'_ u32),
1818
|
1919
help: consider introducing a named lifetime parameter
2020
|
21-
LL | enum Bar<'lifetime> {
22-
LL | Variant(&'lifetime u32),
21+
LL | enum Bar<'r> {
22+
LL | Variant(&'r u32),
2323
|
2424

2525
error: aborting due to 2 previous errors

src/test/ui/underscore-lifetime/underscore-lifetime-binders.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ LL | fn foo2(_: &'_ u8, y: &'_ u8) -> &'_ u8 { y }
3737
| ^^^^^^ ^^^^^^
3838
help: consider introducing a named lifetime parameter
3939
|
40-
LL | fn foo2<'lifetime>(_: &'_ u8, y: &'_ u8) -> &'lifetime u8 { y }
41-
| ^^^^^^^^^^^ ^^^^^^^^^
40+
LL | fn foo2<'r>(_: &'_ u8, y: &'_ u8) -> &'r u8 { y }
41+
| ^^^^ ^^
4242

4343
error: aborting due to 5 previous errors
4444

0 commit comments

Comments
 (0)