diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2022-01-17 06:08:15 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-17 06:08:15 +0100 |
| commit | c6ff4be01153c023666e9069833dc3570c994bf8 (patch) | |
| tree | 23e3ab5680146c5b32211c3cf7cbd08adc118cca /compiler/rustc_parse/src/parser/expr.rs | |
| parent | 681271e04572d052581408df23a8d21cfba30b4a (diff) | |
| parent | 867554ad7c571adea299ecb7ad99641ee22dc91b (diff) | |
| download | rust-c6ff4be01153c023666e9069833dc3570c994bf8.tar.gz rust-c6ff4be01153c023666e9069833dc3570c994bf8.zip | |
Rollup merge of #92876 - compiler-errors:fix-turbofish-lifetime-suggestion, r=nagisa
Fix suggesting turbofish with lifetime arguments Now we suggest turbofish correctly given exprs like `foo<'_>`. Also fix suggestion when we have `let x = foo<bar, baz>;` which was broken.
Diffstat (limited to 'compiler/rustc_parse/src/parser/expr.rs')
| -rw-r--r-- | compiler/rustc_parse/src/parser/expr.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index cd3846d5a22..192e87b4c01 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -1443,7 +1443,7 @@ impl<'a> Parser<'a> { &mut self, label: Label, attrs: AttrVec, - consume_colon: bool, + mut consume_colon: bool, ) -> PResult<'a, P<Expr>> { let lo = label.ident.span; let label = Some(label); @@ -1456,6 +1456,12 @@ impl<'a> Parser<'a> { self.parse_loop_expr(label, lo, attrs) } 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)) { + // 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(); |
