diff options
| author | bors <bors@rust-lang.org> | 2020-01-31 21:51:28 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-01-31 21:51:28 +0000 |
| commit | cdd41ea5fc37d1ba879fd52743bde35fde4a89df (patch) | |
| tree | a2120c677e83069b3bcffe95ec6c5c2fc897765c /src/librustc_parse/parser | |
| parent | cd1ef390e731ed77b90b11b1f77e2c5ca641b261 (diff) | |
| parent | b1c91ee1b1a671e1d277763169abd9986195712a (diff) | |
| download | rust-cdd41ea5fc37d1ba879fd52743bde35fde4a89df.tar.gz rust-cdd41ea5fc37d1ba879fd52743bde35fde4a89df.zip | |
Auto merge of #68633 - JohnTitor:avoid-ice-in-diagnostics, r=estebank
Avoid ICE in macro's diagnostics Fixes #68629 r? @estebank
Diffstat (limited to 'src/librustc_parse/parser')
| -rw-r--r-- | src/librustc_parse/parser/item.rs | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/src/librustc_parse/parser/item.rs b/src/librustc_parse/parser/item.rs index f170abac73a..66116611323 100644 --- a/src/librustc_parse/parser/item.rs +++ b/src/librustc_parse/parser/item.rs @@ -1638,26 +1638,32 @@ impl<'a> Parser<'a> { .span_to_snippet(self.prev_span) .map(|s| s.ends_with(")") || s.ends_with("]")) .unwrap_or(false); - let right_brace_span = if has_close_delim { - // it's safe to peel off one character only when it has the close delim - self.prev_span.with_lo(self.prev_span.hi() - BytePos(1)) - } else { - self.prev_span.shrink_to_hi() - }; - self.struct_span_err( + let mut err = self.struct_span_err( self.prev_span, "macros that expand to items must be delimited with braces or followed by a semicolon", - ) - .multipart_suggestion( - "change the delimiters to curly braces", - vec![ - (self.prev_span.with_hi(self.prev_span.lo() + BytePos(1)), "{".to_string()), - (right_brace_span, '}'.to_string()), - ], - Applicability::MaybeIncorrect, - ) - .span_suggestion( + ); + + // To avoid ICE, we shouldn't emit actual suggestions when it hasn't closing delims + if has_close_delim { + err.multipart_suggestion( + "change the delimiters to curly braces", + vec![ + (self.prev_span.with_hi(self.prev_span.lo() + BytePos(1)), '{'.to_string()), + (self.prev_span.with_lo(self.prev_span.hi() - BytePos(1)), '}'.to_string()), + ], + Applicability::MaybeIncorrect, + ); + } else { + err.span_suggestion( + self.prev_span, + "change the delimiters to curly braces", + " { /* items */ }".to_string(), + Applicability::HasPlaceholders, + ); + } + + err.span_suggestion( self.prev_span.shrink_to_hi(), "add a semicolon", ';'.to_string(), |
