From 285b9d1cd4e170f6a6c98cbdf5f5059b52735d01 Mon Sep 17 00:00:00 2001 From: Michael Goulet Date: Sun, 10 Apr 2022 20:55:10 -0700 Subject: [PATCH] Delay a bug when we see SelfCtor in ref pattern --- compiler/rustc_resolve/src/late.rs | 9 +++++++++ src/test/ui/pattern/issue-95878.rs | 12 ++++++++++++ src/test/ui/pattern/issue-95878.stderr | 8 ++++++++ 3 files changed, 29 insertions(+) create mode 100644 src/test/ui/pattern/issue-95878.rs create mode 100644 src/test/ui/pattern/issue-95878.stderr diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index 6fedabc816c..0fdcc164f02 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -1870,6 +1870,15 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { // These entities are explicitly allowed to be shadowed by fresh bindings. None } + Res::SelfCtor(_) => { + // We resolve `Self` in pattern position as an ident sometimes during recovery, + // so delay a bug instead of ICEing. + self.r.session.delay_span_bug( + ident.span, + "unexpected `SelfCtor` in pattern, expected identifier" + ); + None + } _ => span_bug!( ident.span, "unexpected resolution for an identifier in pattern: {:?}", diff --git a/src/test/ui/pattern/issue-95878.rs b/src/test/ui/pattern/issue-95878.rs new file mode 100644 index 00000000000..f59814468b2 --- /dev/null +++ b/src/test/ui/pattern/issue-95878.rs @@ -0,0 +1,12 @@ +struct Foo<'a>(&'a ()); + +impl<'a> Foo<'a> { + fn spam(&mut self, baz: &mut Vec) { + match 15 { + ref Self => (), + //~^ ERROR expected identifier, found keyword `Self` + } + } +} + +fn main() {} diff --git a/src/test/ui/pattern/issue-95878.stderr b/src/test/ui/pattern/issue-95878.stderr new file mode 100644 index 00000000000..e0eea06e0a3 --- /dev/null +++ b/src/test/ui/pattern/issue-95878.stderr @@ -0,0 +1,8 @@ +error: expected identifier, found keyword `Self` + --> $DIR/issue-95878.rs:6:17 + | +LL | ref Self => (), + | ^^^^ expected identifier, found keyword + +error: aborting due to previous error +