Skip to content

Improved error message for top-level or-patterns #140848

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

Merged
merged 1 commit into from
May 10, 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
4 changes: 2 additions & 2 deletions compiler/rustc_parse/messages.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -690,8 +690,8 @@ parse_nul_in_c_str = null characters in C string literals are not supported

parse_or_in_let_chain = `||` operators are not supported in let chain conditions

parse_or_pattern_not_allowed_in_fn_parameters = top-level or-patterns are not allowed in function parameters
parse_or_pattern_not_allowed_in_let_binding = top-level or-patterns are not allowed in `let` bindings
parse_or_pattern_not_allowed_in_fn_parameters = function parameters require top-level or-patterns in parentheses
parse_or_pattern_not_allowed_in_let_binding = `let` bindings require top-level or-patterns in parentheses
parse_out_of_range_hex_escape = out of range hex escape
.label = must be a character in the range [\x00-\x7f]

Expand Down
2 changes: 1 addition & 1 deletion tests/ui/or-patterns/fn-param-wrap-parens.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ enum E { A, B }
use E::*;

#[cfg(false)]
fn fun1((A | B): E) {} //~ ERROR top-level or-patterns are not allowed
fn fun1((A | B): E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
2 changes: 1 addition & 1 deletion tests/ui/or-patterns/fn-param-wrap-parens.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,4 @@ enum E { A, B }
use E::*;

#[cfg(false)]
fn fun1(A | B: E) {} //~ ERROR top-level or-patterns are not allowed
fn fun1(A | B: E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
2 changes: 1 addition & 1 deletion tests/ui/or-patterns/fn-param-wrap-parens.stderr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error: top-level or-patterns are not allowed in function parameters
error: function parameters require top-level or-patterns in parentheses
--> $DIR/fn-param-wrap-parens.rs:13:9
|
LL | fn fun1(A | B: E) {}
Expand Down
10 changes: 5 additions & 5 deletions tests/ui/or-patterns/nested-undelimited-precedence.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ fn foo() {
let b @ (A | B): E = A;

let b @ A | B: E = A; //~ERROR `b` is not bound in all patterns
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR `let` bindings require top-level or-patterns in parentheses
}

enum F {
Expand All @@ -32,13 +32,13 @@ fn bar() {
let (A(x) | B(x)): F = A(3);

let &A(_) | B(_): F = A(3); //~ERROR mismatched types
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR `let` bindings require top-level or-patterns in parentheses
let &&A(_) | B(_): F = A(3); //~ERROR mismatched types
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR `let` bindings require top-level or-patterns in parentheses
let &mut A(_) | B(_): F = A(3); //~ERROR mismatched types
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR `let` bindings require top-level or-patterns in parentheses
let &&mut A(_) | B(_): F = A(3); //~ERROR mismatched types
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR `let` bindings require top-level or-patterns in parentheses
}

fn main() {}
10 changes: 5 additions & 5 deletions tests/ui/or-patterns/nested-undelimited-precedence.stderr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/nested-undelimited-precedence.rs:19:9
|
LL | let b @ A | B: E = A;
Expand All @@ -9,7 +9,7 @@ help: wrap the pattern in parentheses
LL | let (b @ A | B): E = A;
| + +

error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/nested-undelimited-precedence.rs:34:9
|
LL | let &A(_) | B(_): F = A(3);
Expand All @@ -20,7 +20,7 @@ help: wrap the pattern in parentheses
LL | let (&A(_) | B(_)): F = A(3);
| + +

error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/nested-undelimited-precedence.rs:36:9
|
LL | let &&A(_) | B(_): F = A(3);
Expand All @@ -31,7 +31,7 @@ help: wrap the pattern in parentheses
LL | let (&&A(_) | B(_)): F = A(3);
| + +

error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/nested-undelimited-precedence.rs:38:9
|
LL | let &mut A(_) | B(_): F = A(3);
Expand All @@ -42,7 +42,7 @@ help: wrap the pattern in parentheses
LL | let (&mut A(_) | B(_)): F = A(3);
| + +

error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/nested-undelimited-precedence.rs:40:9
|
LL | let &&mut A(_) | B(_): F = A(3);
Expand Down
8 changes: 4 additions & 4 deletions tests/ui/or-patterns/or-patterns-syntactic-fail.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,18 @@ fn no_top_level_or_patterns() {
fn no_top_level_or_patterns_2() {
// ...and for now neither do we allow or-patterns at the top level of functions.
fn fun1(A | B: E) {}
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR function parameters require top-level or-patterns in parentheses

fn fun2(| A | B: E) {}
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR function parameters require top-level or-patterns in parentheses

// We don't allow top-level or-patterns before type annotation in let-statements because we
// want to reserve this syntactic space for possible future type ascription.
let A | B: E = A;
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR `let` bindings require top-level or-patterns in parentheses

let | A | B: E = A;
//~^ ERROR top-level or-patterns are not allowed
//~^ ERROR `let` bindings require top-level or-patterns in parentheses

let (A | B): E = A; // ok -- wrapped in parens
}
8 changes: 4 additions & 4 deletions tests/ui/or-patterns/or-patterns-syntactic-fail.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ help: you might have meant to open the body of the closure
LL | let _ = |A | { B: E| ();
| +

error: top-level or-patterns are not allowed in function parameters
error: function parameters require top-level or-patterns in parentheses
--> $DIR/or-patterns-syntactic-fail.rs:18:13
|
LL | fn fun1(A | B: E) {}
Expand All @@ -22,7 +22,7 @@ help: wrap the pattern in parentheses
LL | fn fun1((A | B): E) {}
| + +

error: top-level or-patterns are not allowed in function parameters
error: function parameters require top-level or-patterns in parentheses
--> $DIR/or-patterns-syntactic-fail.rs:21:13
|
LL | fn fun2(| A | B: E) {}
Expand All @@ -33,7 +33,7 @@ help: wrap the pattern in parentheses
LL | fn fun2((| A | B): E) {}
| + +

error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/or-patterns-syntactic-fail.rs:26:9
|
LL | let A | B: E = A;
Expand All @@ -44,7 +44,7 @@ help: wrap the pattern in parentheses
LL | let (A | B): E = A;
| + +

error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/or-patterns-syntactic-fail.rs:29:9
|
LL | let | A | B: E = A;
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/or-patterns/remove-leading-vert.fixed
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ fn main() {}

#[cfg(false)]
fn leading() {
fn fun1( A: E) {} //~ ERROR top-level or-patterns are not allowed
fn fun1( A: E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
fn fun2( A: E) {} //~ ERROR unexpected `||` before function parameter
let ( | A): E;
let ( | A): (E); //~ ERROR unexpected token `||` in pattern
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/or-patterns/remove-leading-vert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ fn main() {}

#[cfg(false)]
fn leading() {
fn fun1( | A: E) {} //~ ERROR top-level or-patterns are not allowed
fn fun1( | A: E) {} //~ ERROR function parameters require top-level or-patterns in parentheses
fn fun2( || A: E) {} //~ ERROR unexpected `||` before function parameter
let ( | A): E;
let ( || A): (E); //~ ERROR unexpected token `||` in pattern
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/or-patterns/remove-leading-vert.stderr
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
error: top-level or-patterns are not allowed in function parameters
error: function parameters require top-level or-patterns in parentheses
--> $DIR/remove-leading-vert.rs:11:14
|
LL | fn fun1( | A: E) {}
Expand Down
2 changes: 1 addition & 1 deletion tests/ui/rfcs/rfc-0000-never_patterns/parse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ fn parse(x: Void) {
let res: Result<bool, Void> = Ok(false);
let Ok(_) = res;
let Ok(_) | Err(!) = &res; // Disallowed; see #82048.
//~^ ERROR top-level or-patterns are not allowed in `let` bindings
//~^ ERROR `let` bindings require top-level or-patterns in parentheses
let (Ok(_) | Err(!)) = &res;
let (Ok(_) | Err(&!)) = res.as_ref();

Expand Down
2 changes: 1 addition & 1 deletion tests/ui/rfcs/rfc-0000-never_patterns/parse.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ error: expected one of `,`, `=>`, `if`, `|`, or `}`, found `<=`
LL | Some(!) <=
| ^^ expected one of `,`, `=>`, `if`, `|`, or `}`

error: top-level or-patterns are not allowed in `let` bindings
error: `let` bindings require top-level or-patterns in parentheses
--> $DIR/parse.rs:67:9
|
LL | let Ok(_) | Err(!) = &res; // Disallowed; see #82048.
Expand Down
Loading