Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Always suggest as MachineApplicable in recover_intersection_pat #106066

Merged
merged 1 commit into from
Dec 27, 2022
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
18 changes: 6 additions & 12 deletions compiler/rustc_parse/src/parser/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -491,17 +491,6 @@ impl<'a> Parser<'a> {

if let PatKind::Ident(_, _, sub @ None) = &mut rhs.kind {
// The user inverted the order, so help them fix that.
let mut applicability = Applicability::MachineApplicable;
// FIXME(bindings_after_at): Remove this code when stabilizing the feature.
lhs.walk(&mut |p| match p.kind {
// `check_match` is unhappy if the subpattern has a binding anywhere.
PatKind::Ident(..) => {
applicability = Applicability::MaybeIncorrect;
false // Short-circuit.
}
_ => true,
});

let lhs_span = lhs.span;
// Move the LHS into the RHS as a subpattern.
// The RHS is now the full pattern.
Expand All @@ -510,7 +499,12 @@ impl<'a> Parser<'a> {
self.struct_span_err(sp, "pattern on wrong side of `@`")
.span_label(lhs_span, "pattern on the left, should be on the right")
.span_label(rhs.span, "binding on the right, should be on the left")
.span_suggestion(sp, "switch the order", pprust::pat_to_string(&rhs), applicability)
.span_suggestion(
sp,
"switch the order",
pprust::pat_to_string(&rhs),
Applicability::MachineApplicable,
)
.emit();
} else {
// The special case above doesn't apply so we may have e.g. `A(x) @ B(y)`.
Expand Down
35 changes: 35 additions & 0 deletions src/test/ui/parser/intersection-patterns-1.fixed
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// This tests the parser recovery in `recover_intersection_pat`
// and serves as a regression test for the diagnostics issue #65400.
//
// The general idea is that for `$pat_lhs @ $pat_rhs` where
// `$pat_lhs` is not generated by `ref? mut? $ident` we want
// to suggest either switching the order or note that intersection
// patterns are not allowed.

// run-rustfix

#![allow(unused_variables)]

fn main() {
let s: Option<u8> = None;

match s {
y @ Some(x) => {}
//~^ ERROR pattern on wrong side of `@`
//~| pattern on the left, should be on the right
//~| binding on the right, should be on the left
//~| HELP switch the order
//~| SUGGESTION y @ Some(x)
_ => {}
}

match 2 {
e @ 1..=5 => {}
//~^ ERROR pattern on wrong side of `@`
//~| pattern on the left, should be on the right
//~| binding on the right, should be on the left
//~| HELP switch the order
//~| SUGGESTION e @ 1..=5
_ => {}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
// to suggest either switching the order or note that intersection
// patterns are not allowed.

// run-rustfix

#![allow(unused_variables)]

fn main() {
let s: Option<u8> = None;

Expand All @@ -19,15 +23,6 @@ fn main() {
_ => {}
}

match s {
Some(x) @ Some(y) => {}
//~^ ERROR left-hand side of `@` must be a binding
//~| interpreted as a pattern, not a binding
//~| also a pattern
//~| NOTE bindings are `x`, `mut x`, `ref x`, and `ref mut x`
_ => {}
}

match 2 {
1 ..= 5 @ e => {}
//~^ ERROR pattern on wrong side of `@`
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
error: pattern on wrong side of `@`
--> $DIR/intersection-patterns.rs:13:9
--> $DIR/intersection-patterns-1.rs:17:9
|
LL | Some(x) @ y => {}
| -------^^^-
Expand All @@ -8,19 +8,8 @@ LL | Some(x) @ y => {}
| pattern on the left, should be on the right
| help: switch the order: `y @ Some(x)`

error: left-hand side of `@` must be a binding
--> $DIR/intersection-patterns.rs:23:9
|
LL | Some(x) @ Some(y) => {}
| -------^^^-------
| | |
| | also a pattern
| interpreted as a pattern, not a binding
|
= note: bindings are `x`, `mut x`, `ref x`, and `ref mut x`

error: pattern on wrong side of `@`
--> $DIR/intersection-patterns.rs:32:9
--> $DIR/intersection-patterns-1.rs:27:9
|
LL | 1 ..= 5 @ e => {}
| -------^^^-
Expand All @@ -29,5 +18,5 @@ LL | 1 ..= 5 @ e => {}
| pattern on the left, should be on the right
| help: switch the order: `e @ 1..=5`

error: aborting due to 3 previous errors
error: aborting due to 2 previous errors

20 changes: 20 additions & 0 deletions src/test/ui/parser/intersection-patterns-2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// This tests the parser recovery in `recover_intersection_pat`
// and serves as a regression test for the diagnostics issue #65400.
//
// The general idea is that for `$pat_lhs @ $pat_rhs` where
// `$pat_lhs` is not generated by `ref? mut? $ident` we want
// to suggest either switching the order or note that intersection
// patterns are not allowed.

fn main() {
let s: Option<u8> = None;

match s {
Some(x) @ Some(y) => {}
//~^ ERROR left-hand side of `@` must be a binding
//~| interpreted as a pattern, not a binding
//~| also a pattern
//~| NOTE bindings are `x`, `mut x`, `ref x`, and `ref mut x`
_ => {}
}
}
13 changes: 13 additions & 0 deletions src/test/ui/parser/intersection-patterns-2.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
error: left-hand side of `@` must be a binding
--> $DIR/intersection-patterns-2.rs:13:9
|
LL | Some(x) @ Some(y) => {}
| -------^^^-------
| | |
| | also a pattern
| interpreted as a pattern, not a binding
|
= note: bindings are `x`, `mut x`, `ref x`, and `ref mut x`

error: aborting due to previous error