about summary refs log tree commit diff
path: root/compiler/rustc_parse/src
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2022-01-25 10:47:10 -0800
committerMichael Goulet <michael@errs.io>2022-01-25 10:47:10 -0800
commita090bb1dea18af72dce2195fa4de396bcb51061b (patch)
tree6dc713dc36ed7fbee4b5483792db4e3a68fa0cd7 /compiler/rustc_parse/src
parente7825f2b690c9a0d21b6f6d84c404bb53b151b38 (diff)
downloadrust-a090bb1dea18af72dce2195fa4de396bcb51061b.tar.gz
rust-a090bb1dea18af72dce2195fa4de396bcb51061b.zip
Remove delayed bug when encountering label in bad turbofish
Diffstat (limited to 'compiler/rustc_parse/src')
-rw-r--r--compiler/rustc_parse/src/parser/diagnostics.rs2
-rw-r--r--compiler/rustc_parse/src/parser/expr.rs5
2 files changed, 4 insertions, 3 deletions
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs
index c41f2d3299b..15f29d083db 100644
--- a/compiler/rustc_parse/src/parser/diagnostics.rs
+++ b/compiler/rustc_parse/src/parser/diagnostics.rs
@@ -737,7 +737,7 @@ impl<'a> Parser<'a> {
                                     "::".to_string(),
                                     Applicability::MaybeIncorrect,
                                 );
-                                if self.check(&TokenKind::Semi) {
+                                if matches!(self.token.kind, token::Semi | token::CloseDelim(_)) {
                                     turbo_err.emit();
                                     *expr = self.mk_expr_err(expr.span);
                                     return Ok(());
diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs
index 26284728ff2..19ad1b3cec8 100644
--- a/compiler/rustc_parse/src/parser/expr.rs
+++ b/compiler/rustc_parse/src/parser/expr.rs
@@ -1448,6 +1448,8 @@ impl<'a> Parser<'a> {
         let lo = label.ident.span;
         let label = Some(label);
         let ate_colon = self.eat(&token::Colon);
+        let msg = "expected `while`, `for`, `loop` or `{` after a label";
+
         let expr = if self.eat_keyword(kw::While) {
             self.parse_while_expr(label, lo, attrs)
         } else if self.eat_keyword(kw::For) {
@@ -1457,13 +1459,12 @@ impl<'a> Parser<'a> {
         } else if self.check(&token::OpenDelim(token::Brace)) || self.token.is_whole_block() {
             self.parse_block_expr(label, lo, BlockCheckMode::Default, attrs)
         } else if !ate_colon && (self.check(&TokenKind::Comma) || self.check(&TokenKind::Gt)) {
+            self.struct_span_err(self.token.span, msg).span_label(self.token.span, msg).emit();
             // We're probably inside of a `Path<'a>` that needs a turbofish, so suppress the
             // "must be followed by a colon" error.
-            self.diagnostic().delay_span_bug(lo, "this label wasn't parsed correctly");
             consume_colon = false;
             Ok(self.mk_expr_err(lo))
         } else {
-            let msg = "expected `while`, `for`, `loop` or `{` after a label";
             self.struct_span_err(self.token.span, msg).span_label(self.token.span, msg).emit();
             // Continue as an expression in an effort to recover on `'label: non_block_expr`.
             self.parse_expr()