Rollup merge of #113177 - estebank:hrlt-sugg, r=compiler-errors

Use structured suggestion when telling user about `for<'a>`

```
error[E0637]: `&` without an explicit lifetime name cannot be used here
  --> $DIR/E0637.rs:13:13
   |
LL |     T: Into<&u32>,
   |             ^ explicit lifetime name needed here
   |
help: consider introducing a higher-ranked lifetime here
   |
LL |     T: for<'a> Into<&'a u32>,
   |        +++++++       ++
```
This commit is contained in:
Matthias Krüger 2023-06-30 08:01:14 +02:00 committed by GitHub
commit 207b24413c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 157 additions and 64 deletions

View File

@ -1632,9 +1632,13 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
..
} = &rib.kind
{
diag.span_help(
*span,
"consider introducing a higher-ranked lifetime here with `for<'a>`",
diag.multipart_suggestion(
"consider introducing a higher-ranked lifetime here",
vec![
(span.shrink_to_lo(), "for<'a> ".into()),
(lifetime.ident.span.shrink_to_hi(), "'a ".into()),
],
Applicability::MachineApplicable,
);
break;
}

View File

@ -22,11 +22,10 @@ error[E0637]: `&` without an explicit lifetime name cannot be used here
LL | T: Into<&u32>,
| ^ explicit lifetime name needed here
|
help: consider introducing a higher-ranked lifetime here with `for<'a>`
--> $DIR/E0637.rs:13:8
help: consider introducing a higher-ranked lifetime here
|
LL | T: Into<&u32>,
| ^
LL | T: for<'a> Into<&'a u32>,
| +++++++ ++
error: aborting due to 3 previous errors

View File

@ -4,11 +4,10 @@ error[E0637]: `&` without an explicit lifetime name cannot be used here
LL | fn should_error<T>() where T : Into<&u32> {}
| ^ explicit lifetime name needed here
|
help: consider introducing a higher-ranked lifetime here with `for<'a>`
--> $DIR/issue-65285-incorrect-explicit-lifetime-name-needed.rs:5:32
help: consider introducing a higher-ranked lifetime here
|
LL | fn should_error<T>() where T : Into<&u32> {}
| ^
LL | fn should_error<T>() where T : for<'a> Into<&'a u32> {}
| +++++++ ++
error[E0106]: missing lifetime specifier
--> $DIR/issue-65285-incorrect-explicit-lifetime-name-needed.rs:9:20

View File

@ -0,0 +1,17 @@
// run-rustfix
trait WithType<T> {}
trait WithRegion<'a> { }
#[allow(dead_code)]
struct Foo<T> {
t: T
}
impl<T> Foo<T>
where
T: for<'a> WithType<&'a u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -0,0 +1,17 @@
// run-rustfix
trait WithType<T> {}
trait WithRegion<'a> { }
#[allow(dead_code)]
struct Foo<T> {
t: T
}
impl<T> Foo<T>
where
T: WithType<&u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -1,14 +1,13 @@
error[E0637]: `&` without an explicit lifetime name cannot be used here
--> $DIR/where-clause-trait-impl-region.rs:11:17
--> $DIR/where-clause-inherent-impl-ampersand-rust2015.rs:13:17
|
LL | T: WithType<&u32>
| ^ explicit lifetime name needed here
|
help: consider introducing a higher-ranked lifetime here with `for<'a>`
--> $DIR/where-clause-trait-impl-region.rs:11:8
help: consider introducing a higher-ranked lifetime here
|
LL | T: WithType<&u32>
| ^
LL | T: for<'a> WithType<&'a u32>
| +++++++ ++
error: aborting due to previous error

View File

@ -0,0 +1,18 @@
// edition:2018
// run-rustfix
trait WithType<T> {}
trait WithRegion<'a> { }
#[allow(dead_code)]
struct Foo<T> {
t: T
}
impl<T> Foo<T>
where
T: for<'a> WithType<&'a u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -0,0 +1,18 @@
// edition:2018
// run-rustfix
trait WithType<T> {}
trait WithRegion<'a> { }
#[allow(dead_code)]
struct Foo<T> {
t: T
}
impl<T> Foo<T>
where
T: WithType<&u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -1,14 +1,13 @@
error[E0637]: `&` without an explicit lifetime name cannot be used here
--> $DIR/where-clause-trait-impl-region.rs:11:17
--> $DIR/where-clause-inherent-impl-ampersand-rust2018.rs:14:17
|
LL | T: WithType<&u32>
| ^ explicit lifetime name needed here
|
help: consider introducing a higher-ranked lifetime here with `for<'a>`
--> $DIR/where-clause-trait-impl-region.rs:11:8
help: consider introducing a higher-ranked lifetime here
|
LL | T: WithType<&u32>
| ^
LL | T: for<'a> WithType<&'a u32>
| +++++++ ++
error: aborting due to previous error

View File

@ -1,18 +0,0 @@
// revisions: rust2015 rust2018
//[rust2018] edition:2018
trait WithType<T> {}
trait WithRegion<'a> { }
struct Foo<T> {
t: T
}
impl<T> Foo<T>
where
T: WithType<&u32>
//[rust2015]~^ ERROR `&` without an explicit lifetime name cannot be used here
//[rust2018]~^^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -0,0 +1,14 @@
// run-rustfix
trait WithType<T> {}
trait WithRegion<'a> { }
trait Foo { }
impl<T> Foo for Vec<T>
where
T: for<'a> WithType<&'a u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -0,0 +1,14 @@
// run-rustfix
trait WithType<T> {}
trait WithRegion<'a> { }
trait Foo { }
impl<T> Foo for Vec<T>
where
T: WithType<&u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -1,14 +1,13 @@
error[E0637]: `&` without an explicit lifetime name cannot be used here
--> $DIR/where-clause-inherent-impl-ampersand.rs:13:17
--> $DIR/where-clause-trait-impl-region-2015.rs:10:17
|
LL | T: WithType<&u32>
| ^ explicit lifetime name needed here
|
help: consider introducing a higher-ranked lifetime here with `for<'a>`
--> $DIR/where-clause-inherent-impl-ampersand.rs:13:8
help: consider introducing a higher-ranked lifetime here
|
LL | T: WithType<&u32>
| ^
LL | T: for<'a> WithType<&'a u32>
| +++++++ ++
error: aborting due to previous error

View File

@ -0,0 +1,15 @@
// run-rustfix
// edition:2018
trait WithType<T> {}
trait WithRegion<'a> { }
trait Foo { }
impl<T> Foo for Vec<T>
where
T: for<'a> WithType<&'a u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -0,0 +1,15 @@
// run-rustfix
// edition:2018
trait WithType<T> {}
trait WithRegion<'a> { }
trait Foo { }
impl<T> Foo for Vec<T>
where
T: WithType<&u32>
//~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}

View File

@ -1,14 +1,13 @@
error[E0637]: `&` without an explicit lifetime name cannot be used here
--> $DIR/where-clause-inherent-impl-ampersand.rs:13:17
--> $DIR/where-clause-trait-impl-region-2018.rs:11:17
|
LL | T: WithType<&u32>
| ^ explicit lifetime name needed here
|
help: consider introducing a higher-ranked lifetime here with `for<'a>`
--> $DIR/where-clause-inherent-impl-ampersand.rs:13:8
help: consider introducing a higher-ranked lifetime here
|
LL | T: WithType<&u32>
| ^
LL | T: for<'a> WithType<&'a u32>
| +++++++ ++
error: aborting due to previous error

View File

@ -1,15 +0,0 @@
// revisions: rust2015 rust2018
//[rust2018] edition:2018
trait WithType<T> {}
trait WithRegion<'a> { }
trait Foo { }
impl<T> Foo for Vec<T>
where
T: WithType<&u32>
//[rust2015,rust2018]~^ ERROR `&` without an explicit lifetime name cannot be used here
{ }
fn main() {}