Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Fix "missing match arm body" suggestion involving ! #137435

Merged
merged 1 commit into from
Feb 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion compiler/rustc_ast_passes/src/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -804,7 +804,14 @@ pub(crate) struct NegativeBoundWithParentheticalNotation {
pub(crate) struct MatchArmWithNoBody {
#[primary_span]
pub span: Span,
#[suggestion(code = " => todo!(),", applicability = "has-placeholders")]
// We include the braces around `todo!()` so that a comma is optional, and we don't have to have
// any logic looking at the arm being replaced if there was a comma already or not for the
// resulting code to be correct.
#[suggestion(
code = " => {{ todo!() }}",
applicability = "has-placeholders",
style = "verbose"
)]
pub suggestion: Span,
}

Expand Down
3 changes: 2 additions & 1 deletion compiler/rustc_parse/src/parser/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3125,10 +3125,11 @@ impl<'a> Parser<'a> {
let mut result = if armless {
// A pattern without a body, allowed for never patterns.
arm_body = None;
let span = lo.to(this.prev_token.span);
this.expect_one_of(&[exp!(Comma)], &[exp!(CloseBrace)]).map(|x| {
// Don't gate twice
if !pat.contains_never_pattern() {
this.psess.gated_spans.gate(sym::never_patterns, pat.span);
this.psess.gated_spans.gate(sym::never_patterns, span);
}
x
})
Expand Down
35 changes: 30 additions & 5 deletions tests/ui/feature-gates/feature-gate-never_patterns.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -58,19 +58,34 @@ error: `match` arm with no body
--> $DIR/feature-gate-never_patterns.rs:38:9
|
LL | Some(_)
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) => { todo!() }
| ++++++++++++++

error: `match` arm with no body
--> $DIR/feature-gate-never_patterns.rs:43:9
|
LL | Some(_) if false,
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) if false => { todo!() },
| ++++++++++++++

error: `match` arm with no body
--> $DIR/feature-gate-never_patterns.rs:45:9
|
LL | Some(_) if false
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) if false => { todo!() }
| ++++++++++++++

error[E0658]: `!` patterns are experimental
--> $DIR/feature-gate-never_patterns.rs:50:13
Expand All @@ -96,13 +111,23 @@ error: `match` arm with no body
--> $DIR/feature-gate-never_patterns.rs:64:9
|
LL | Some(_)
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) => { todo!() }
| ++++++++++++++

error: `match` arm with no body
--> $DIR/feature-gate-never_patterns.rs:70:9
|
LL | Some(_) if false
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) if false => { todo!() }
| ++++++++++++++

error: a guard on a never pattern will never be run
--> $DIR/feature-gate-never_patterns.rs:54:19
Expand Down
7 changes: 6 additions & 1 deletion tests/ui/parser/macro/macro-expand-to-match-arm.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ error: `match` arm with no body
--> $DIR/macro-expand-to-match-arm.rs:14:9
|
LL | arm!(None => {}),
| ^^^^^^^^^^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | arm!(None => {}) => { todo!() },
| ++++++++++++++
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't great, we'll have to deal with macros somehow :-/


error: aborting due to 2 previous errors

56 changes: 48 additions & 8 deletions tests/ui/parser/match-arm-without-body.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -68,49 +68,89 @@ error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:7:9
|
LL | Some(_)
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) => { todo!() }
| ++++++++++++++

error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:30:9
|
LL | Some(_) if true
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) if true => { todo!() }
| ++++++++++++++

error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:40:9
|
LL | Some(_) if true,
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) if true => { todo!() },
| ++++++++++++++

error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:45:9
|
LL | Some(_) if true,
| ^^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | Some(_) if true => { todo!() },
| ++++++++++++++

error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:51:9
|
LL | pat!()
| ^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^
|
help: add a body after the pattern
|
LL | pat!() => { todo!() }
| ++++++++++++++

error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:56:9
|
LL | pat!(),
| ^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^
|
help: add a body after the pattern
|
LL | pat!() => { todo!() },
| ++++++++++++++

error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:61:9
|
LL | pat!() if true,
| ^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^^^^^^^^^
|
help: add a body after the pattern
|
LL | pat!() if true => { todo!() },
| ++++++++++++++

error: `match` arm with no body
--> $DIR/match-arm-without-body.rs:72:9
|
LL | pat!(),
| ^^^^^^- help: add a body after the pattern: `=> todo!(),`
| ^^^^^^
|
help: add a body after the pattern
|
LL | pat!() => { todo!() },
| ++++++++++++++

error: aborting due to 13 previous errors

Loading