Fix suggestions for missing return type lifetime parameters
This commit is contained in:
parent
e5f83d24ae
commit
439ef6d762
9 changed files with 513 additions and 150 deletions
17
src/test/ui/issues/issue-84592.rs
Normal file
17
src/test/ui/issues/issue-84592.rs
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
/* Checks whether issue #84592 has been resolved. The issue was
|
||||
* that in this example, there are two expected/missing lifetime
|
||||
* parameters with *different spans*, leading to incorrect
|
||||
* suggestions from rustc.
|
||||
*/
|
||||
|
||||
struct TwoLifetimes<'x, 'y> {
|
||||
x: &'x (),
|
||||
y: &'y (),
|
||||
}
|
||||
|
||||
fn two_lifetimes_needed(a: &(), b: &()) -> TwoLifetimes<'_, '_> {
|
||||
//~^ ERROR missing lifetime specifiers [E0106]
|
||||
TwoLifetimes { x: &(), y: &() }
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
17
src/test/ui/issues/issue-84592.stderr
Normal file
17
src/test/ui/issues/issue-84592.stderr
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
error[E0106]: missing lifetime specifiers
|
||||
--> $DIR/issue-84592.rs:12:57
|
||||
|
|
||||
LL | fn two_lifetimes_needed(a: &(), b: &()) -> TwoLifetimes<'_, '_> {
|
||||
| --- --- ^^ ^^ expected named lifetime parameter
|
||||
| |
|
||||
| expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a` or `b`
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn two_lifetimes_needed<'a>(a: &'a (), b: &'a ()) -> TwoLifetimes<'a, 'a> {
|
||||
| ^^^^ ^^^^^^ ^^^^^^ ^^ ^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
||||
37
src/test/ui/return-elided-lifetime.rs
Normal file
37
src/test/ui/return-elided-lifetime.rs
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
/* Checks all four scenarios possible in report_elision_failure() of
|
||||
* rustc_resolve::late::lifetimes::LifetimeContext related to returning
|
||||
* borrowed values, in various configurations.
|
||||
*/
|
||||
|
||||
fn f1() -> &i32 { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
fn f1_() -> (&i32, &i32) { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
//~^^ ERROR missing lifetime specifier [E0106]
|
||||
|
||||
fn f2(a: i32, b: i32) -> &i32 { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
fn f2_(a: i32, b: i32) -> (&i32, &i32) { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
//~^^ ERROR missing lifetime specifier [E0106]
|
||||
|
||||
struct S<'a, 'b> { a: &'a i32, b: &'b i32 }
|
||||
fn f3(s: &S) -> &i32 { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
fn f3_(s: &S, t: &S) -> (&i32, &i32) { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
//~^^ ERROR missing lifetime specifier [E0106]
|
||||
|
||||
fn f4<'a, 'b>(a: &'a i32, b: &'b i32) -> &i32 { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
fn f4_<'a, 'b>(a: &'a i32, b: &'b i32) -> (&i32, &i32) { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
//~^^ ERROR missing lifetime specifier [E0106]
|
||||
|
||||
fn f5<'a>(a: &'a i32, b: &i32) -> &i32 { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
fn f5_<'a>(a: &'a i32, b: &i32) -> (&i32, &i32) { loop {} }
|
||||
//~^ ERROR missing lifetime specifier [E0106]
|
||||
//~^^ ERROR missing lifetime specifier [E0106]
|
||||
|
||||
fn main() {}
|
||||
198
src/test/ui/return-elided-lifetime.stderr
Normal file
198
src/test/ui/return-elided-lifetime.stderr
Normal file
|
|
@ -0,0 +1,198 @@
|
|||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:6:12
|
||||
|
|
||||
LL | fn f1() -> &i32 { loop {} }
|
||||
| ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
|
||||
help: consider using the `'static` lifetime
|
||||
|
|
||||
LL | fn f1() -> &'static i32 { loop {} }
|
||||
| ^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:8:14
|
||||
|
|
||||
LL | fn f1_() -> (&i32, &i32) { loop {} }
|
||||
| ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
|
||||
help: consider using the `'static` lifetime
|
||||
|
|
||||
LL | fn f1_() -> (&'static i32, &i32) { loop {} }
|
||||
| ^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:8:20
|
||||
|
|
||||
LL | fn f1_() -> (&i32, &i32) { loop {} }
|
||||
| ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
|
||||
help: consider using the `'static` lifetime
|
||||
|
|
||||
LL | fn f1_() -> (&i32, &'static i32) { loop {} }
|
||||
| ^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:12:26
|
||||
|
|
||||
LL | fn f2(a: i32, b: i32) -> &i32 { loop {} }
|
||||
| ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments
|
||||
help: consider using the `'static` lifetime
|
||||
|
|
||||
LL | fn f2(a: i32, b: i32) -> &'static i32 { loop {} }
|
||||
| ^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:14:28
|
||||
|
|
||||
LL | fn f2_(a: i32, b: i32) -> (&i32, &i32) { loop {} }
|
||||
| ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments
|
||||
help: consider using the `'static` lifetime
|
||||
|
|
||||
LL | fn f2_(a: i32, b: i32) -> (&'static i32, &i32) { loop {} }
|
||||
| ^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:14:34
|
||||
|
|
||||
LL | fn f2_(a: i32, b: i32) -> (&i32, &i32) { loop {} }
|
||||
| ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value with an elided lifetime, but the lifetime cannot be derived from the arguments
|
||||
help: consider using the `'static` lifetime
|
||||
|
|
||||
LL | fn f2_(a: i32, b: i32) -> (&i32, &'static i32) { loop {} }
|
||||
| ^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:19:17
|
||||
|
|
||||
LL | fn f3(s: &S) -> &i32 { loop {} }
|
||||
| -- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say which one of `s`'s 3 lifetimes it is borrowed from
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn f3<'a>(s: &'a S) -> &'a i32 { loop {} }
|
||||
| ^^^^ ^^^^^ ^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:21:26
|
||||
|
|
||||
LL | fn f3_(s: &S, t: &S) -> (&i32, &i32) { loop {} }
|
||||
| -- -- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `s`'s 3 lifetimes or one of `t`'s 3 lifetimes
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn f3_<'a>(s: &'a S, t: &'a S) -> (&'a i32, &i32) { loop {} }
|
||||
| ^^^^ ^^^^^ ^^^^^ ^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:21:32
|
||||
|
|
||||
LL | fn f3_(s: &S, t: &S) -> (&i32, &i32) { loop {} }
|
||||
| -- -- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from one of `s`'s 3 lifetimes or one of `t`'s 3 lifetimes
|
||||
help: consider introducing a named lifetime parameter
|
||||
|
|
||||
LL | fn f3_<'a>(s: &'a S, t: &'a S) -> (&i32, &'a i32) { loop {} }
|
||||
| ^^^^ ^^^^^ ^^^^^ ^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:25:42
|
||||
|
|
||||
LL | fn f4<'a, 'b>(a: &'a i32, b: &'b i32) -> &i32 { loop {} }
|
||||
| ------- ------- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a` or `b`
|
||||
note: these named lifetimes are available to use
|
||||
--> $DIR/return-elided-lifetime.rs:25:7
|
||||
|
|
||||
LL | fn f4<'a, 'b>(a: &'a i32, b: &'b i32) -> &i32 { loop {} }
|
||||
| ^^ ^^
|
||||
help: consider using one of the available lifetimes here
|
||||
|
|
||||
LL | fn f4<'a, 'b>(a: &'a i32, b: &'b i32) -> &'lifetime i32 { loop {} }
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:27:44
|
||||
|
|
||||
LL | fn f4_<'a, 'b>(a: &'a i32, b: &'b i32) -> (&i32, &i32) { loop {} }
|
||||
| ------- ------- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a` or `b`
|
||||
note: these named lifetimes are available to use
|
||||
--> $DIR/return-elided-lifetime.rs:27:8
|
||||
|
|
||||
LL | fn f4_<'a, 'b>(a: &'a i32, b: &'b i32) -> (&i32, &i32) { loop {} }
|
||||
| ^^ ^^
|
||||
help: consider using one of the available lifetimes here
|
||||
|
|
||||
LL | fn f4_<'a, 'b>(a: &'a i32, b: &'b i32) -> (&'lifetime i32, &i32) { loop {} }
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:27:50
|
||||
|
|
||||
LL | fn f4_<'a, 'b>(a: &'a i32, b: &'b i32) -> (&i32, &i32) { loop {} }
|
||||
| ------- ------- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a` or `b`
|
||||
note: these named lifetimes are available to use
|
||||
--> $DIR/return-elided-lifetime.rs:27:8
|
||||
|
|
||||
LL | fn f4_<'a, 'b>(a: &'a i32, b: &'b i32) -> (&i32, &i32) { loop {} }
|
||||
| ^^ ^^
|
||||
help: consider using one of the available lifetimes here
|
||||
|
|
||||
LL | fn f4_<'a, 'b>(a: &'a i32, b: &'b i32) -> (&i32, &'lifetime i32) { loop {} }
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:31:35
|
||||
|
|
||||
LL | fn f5<'a>(a: &'a i32, b: &i32) -> &i32 { loop {} }
|
||||
| ------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a` or `b`
|
||||
help: consider using the `'a` lifetime
|
||||
|
|
||||
LL | fn f5<'a>(a: &'a i32, b: &i32) -> &'a i32 { loop {} }
|
||||
| ^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:33:37
|
||||
|
|
||||
LL | fn f5_<'a>(a: &'a i32, b: &i32) -> (&i32, &i32) { loop {} }
|
||||
| ------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a` or `b`
|
||||
help: consider using the `'a` lifetime
|
||||
|
|
||||
LL | fn f5_<'a>(a: &'a i32, b: &i32) -> (&'a i32, &i32) { loop {} }
|
||||
| ^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/return-elided-lifetime.rs:33:43
|
||||
|
|
||||
LL | fn f5_<'a>(a: &'a i32, b: &i32) -> (&i32, &i32) { loop {} }
|
||||
| ------- ---- ^ expected named lifetime parameter
|
||||
|
|
||||
= help: this function's return type contains a borrowed value, but the signature does not say whether it is borrowed from `a` or `b`
|
||||
help: consider using the `'a` lifetime
|
||||
|
|
||||
LL | fn f5_<'a>(a: &'a i32, b: &i32) -> (&i32, &'a i32) { loop {} }
|
||||
| ^^^
|
||||
|
||||
error: aborting due to 15 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0106`.
|
||||
|
|
@ -44,6 +44,10 @@ note: these named lifetimes are available to use
|
|||
|
|
||||
LL | struct V<'a>(&'a dyn for<'b> Fn(&X) -> &X);
|
||||
| ^^ ^^
|
||||
help: consider using one of the available lifetimes here
|
||||
|
|
||||
LL | struct V<'a>(&'a dyn for<'b> Fn(&X) -> &'lifetime X);
|
||||
| ^^^^^^^^^^
|
||||
|
||||
error[E0106]: missing lifetime specifier
|
||||
--> $DIR/missing-lt-for-hrtb.rs:5:41
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ use std::path::Path;
|
|||
const ENTRY_LIMIT: usize = 1000;
|
||||
// FIXME: The following limits should be reduced eventually.
|
||||
const ROOT_ENTRY_LIMIT: usize = 1388;
|
||||
const ISSUES_ENTRY_LIMIT: usize = 2551;
|
||||
const ISSUES_ENTRY_LIMIT: usize = 2557;
|
||||
|
||||
fn check_entries(path: &Path, bad: &mut bool) {
|
||||
let dirs = walkdir::WalkDir::new(&path.join("test/ui"))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue