Skip to content

Commit

Permalink
Rollup merge of #110982 - cjgillot:elided-self-const, r=petrochenkov
Browse files Browse the repository at this point in the history
Do not recurse into const generic args when resolving self lifetime elision.

Fixes #110899

r? `@petrochenkov`
  • Loading branch information
matthiaskrgr authored May 4, 2023
2 parents 0ac8ebd + 8972a23 commit 8d66f01
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
4 changes: 4 additions & 0 deletions compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2070,6 +2070,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
Expand Down
13 changes: 13 additions & 0 deletions tests/ui/self/elision/nested-item.rs
Original file line number Diff line number Diff line change
@@ -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() {}
38 changes: 38 additions & 0 deletions tests/ui/self/elision/nested-item.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit 8d66f01

Please sign in to comment.