Do not recurse into const generic args when resolving self lifetime elision.

This commit is contained in:
Camille GILLOT 2023-04-29 10:09:55 +00:00
parent 89158e210c
commit 8972a23f48
3 changed files with 55 additions and 0 deletions

View File

@ -2075,6 +2075,10 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
}
visit::walk_ty(self, ty)
}
// A type may have an expression as a const generic argument.
// We do not want to recurse into those.
fn visit_expr(&mut self, _: &'a Expr) {}
}
let impl_self = self

View File

@ -0,0 +1,13 @@
// Regression test for #110899.
// When looking for the elided lifetime for `wrap`,
// we must not consider the lifetimes in `bar` as candidates.
fn wrap(self: Wrap<{ fn bar(&self) {} }>) -> &() {
//~^ ERROR `self` parameter is only allowed in associated functions
//~| ERROR `self` parameter is only allowed in associated functions
//~| ERROR missing lifetime specifier
//~| ERROR cannot find type `Wrap` in this scope
&()
}
fn main() {}

View File

@ -0,0 +1,38 @@
error: `self` parameter is only allowed in associated functions
--> $DIR/nested-item.rs:5:9
|
LL | fn wrap(self: Wrap<{ fn bar(&self) {} }>) -> &() {
| ^^^^ not semantically valid as function parameter
|
= note: associated functions are those in `impl` or `trait` definitions
error: `self` parameter is only allowed in associated functions
--> $DIR/nested-item.rs:5:29
|
LL | fn wrap(self: Wrap<{ fn bar(&self) {} }>) -> &() {
| ^^^^^ not semantically valid as function parameter
|
= note: associated functions are those in `impl` or `trait` definitions
error[E0106]: missing lifetime specifier
--> $DIR/nested-item.rs:5:46
|
LL | fn wrap(self: Wrap<{ fn bar(&self) {} }>) -> &() {
| ^ 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 wrap(self: Wrap<{ fn bar(&self) {} }>) -> &'static () {
| +++++++
error[E0412]: cannot find type `Wrap` in this scope
--> $DIR/nested-item.rs:5:15
|
LL | fn wrap(self: Wrap<{ fn bar(&self) {} }>) -> &() {
| ^^^^ not found in this scope
error: aborting due to 4 previous errors
Some errors have detailed explanations: E0106, E0412.
For more information about an error, try `rustc --explain E0106`.