Skip to content

Commit

Permalink
Fix ICE in diagnostics for parenthesized type arguments
Browse files Browse the repository at this point in the history
  • Loading branch information
wutchzone committed Mar 12, 2024
1 parent 7de1a1f commit eab1f30
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 21 deletions.
52 changes: 31 additions & 21 deletions compiler/rustc_parse/src/parser/path.rs
Original file line number Diff line number Diff line change
Expand Up @@ -449,9 +449,13 @@ impl<'a> Parser<'a> {
prev_token_before_parsing: Token,
error: &mut Diag<'_>,
) {
if ((style == PathStyle::Expr && self.parse_paren_comma_seq(|p| p.parse_expr()).is_ok())
|| (style == PathStyle::Pat
&& self
match style {
PathStyle::Expr
if let Ok(_) = self
.parse_paren_comma_seq(|p| p.parse_expr())
.map_err(|error| error.cancel()) => {}
PathStyle::Pat
if let Ok(_) = self
.parse_paren_comma_seq(|p| {
p.parse_pat_allow_top_alt(
None,
Expand All @@ -460,25 +464,31 @@ impl<'a> Parser<'a> {
CommaRecoveryMode::LikelyTuple,
)
})
.is_ok()))
&& !matches!(self.token.kind, token::ModSep | token::RArrow)
{
error.span_suggestion_verbose(
prev_token_before_parsing.span,
format!(
"consider removing the `::` here to {}",
match style {
PathStyle::Expr => "call the expression",
PathStyle::Pat => "turn this into a tuple struct pattern",
_ => {
return;
}
}
),
"",
Applicability::MaybeIncorrect,
);
.map_err(|error| error.cancel()) => {}
_ => {
return;
}
}

if let token::ModSep | token::RArrow = self.token.kind {
return;
}

error.span_suggestion_verbose(
prev_token_before_parsing.span,
format!(
"consider removing the `::` here to {}",
match style {
PathStyle::Expr => "call the expression",
PathStyle::Pat => "turn this into a tuple struct pattern",
_ => {
return;
}
}
),
"",
Applicability::MaybeIncorrect,
);
}

/// Parses generic args (within a path segment) with recovery for extra leading angle brackets.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
fn main() {
unsafe {
dealloc(ptr2, Layout::(x: !)(1, 1)); //~ ERROR: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `:`
//~^ ERROR: expected one of `.`, `;`, `?`, `}`, or an operator, found `)`
//~| while parsing this parenthesized list of type arguments starting here
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
error: expected one of `!`, `(`, `)`, `+`, `,`, `::`, or `<`, found `:`
--> $DIR/diagnostics-parenthesized-type-arguments-ice-issue-122345.rs:3:33
|
LL | dealloc(ptr2, Layout::(x: !)(1, 1));
| --- ^ expected one of 7 possible tokens
| |
| while parsing this parenthesized list of type arguments starting here

error: expected one of `.`, `;`, `?`, `}`, or an operator, found `)`
--> $DIR/diagnostics-parenthesized-type-arguments-ice-issue-122345.rs:3:43
|
LL | dealloc(ptr2, Layout::(x: !)(1, 1));
| ^ expected one of `.`, `;`, `?`, `}`, or an operator

error: aborting due to 2 previous errors

0 comments on commit eab1f30

Please sign in to comment.