summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamille GILLOT <gillot.camille@gmail.com>2023-04-29 10:09:55 +0000
committerCamille GILLOT <gillot.camille@gmail.com>2023-05-03 18:07:53 +0000
commit8972a23f4827e784a9dc2f14435d2bc34197c74b (patch)
treec583a4624edde3a2346ce14c4e197577b382f845
parent89158e210ce0b9550b42c65ede244087f2e144b5 (diff)
downloadrust-8972a23f4827e784a9dc2f14435d2bc34197c74b.tar.gz
Do not recurse into const generic args when resolving self lifetime elision.
-rw-r--r--compiler/rustc_resolve/src/late.rs4
-rw-r--r--tests/ui/self/elision/nested-item.rs13
-rw-r--r--tests/ui/self/elision/nested-item.stderr38
3 files changed, 55 insertions, 0 deletions
diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs
index 511ae8516a8..b783acc8607 100644
--- a/compiler/rustc_resolve/src/late.rs
+++ b/compiler/rustc_resolve/src/late.rs
@@ -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
diff --git a/tests/ui/self/elision/nested-item.rs b/tests/ui/self/elision/nested-item.rs
new file mode 100644
index 00000000000..4bcb645c60e
--- /dev/null
+++ b/tests/ui/self/elision/nested-item.rs
@@ -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() {}
diff --git a/tests/ui/self/elision/nested-item.stderr b/tests/ui/self/elision/nested-item.stderr
new file mode 100644
index 00000000000..752fd82332c
--- /dev/null
+++ b/tests/ui/self/elision/nested-item.stderr
@@ -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`.