Correctly handle while-let-chains
This commit is contained in:
parent
9455259450
commit
a49368f00b
@ -129,7 +129,7 @@ fn parse_token_tree_open_delim(
|
||||
while parser.token != token::Eof {
|
||||
if let Err(diff_err) = parser.err_diff_marker() {
|
||||
diff_errs.push(diff_err);
|
||||
} else if parser.token.is_keyword(kw::If) {
|
||||
} else if parser.is_keyword_ahead(0, &[kw::If, kw::While]) {
|
||||
in_cond = true;
|
||||
} else if matches!(
|
||||
parser.token.kind,
|
||||
|
@ -1115,7 +1115,7 @@ pub fn look_ahead<R>(&self, dist: usize, looker: impl FnOnce(&Token) -> R) -> R
|
||||
}
|
||||
|
||||
/// Returns whether any of the given keywords are `dist` tokens ahead of the current one.
|
||||
fn is_keyword_ahead(&self, dist: usize, kws: &[Symbol]) -> bool {
|
||||
pub fn is_keyword_ahead(&self, dist: usize, kws: &[Symbol]) -> bool {
|
||||
self.look_ahead(dist, |t| kws.iter().any(|&kw| t.is_keyword(kw)))
|
||||
}
|
||||
|
||||
|
@ -9,6 +9,27 @@ fn main() {
|
||||
}
|
||||
}
|
||||
|
||||
fn quux() {
|
||||
while let () = ()
|
||||
&& let () = () { //~ERROR: found a `{` in the middle of a let-chain
|
||||
&& let () = ()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
fn foobar() {
|
||||
while false {}
|
||||
{
|
||||
&& let () = ()
|
||||
}
|
||||
|
||||
fn fubar() {
|
||||
while false {
|
||||
{
|
||||
&& let () = ()
|
||||
}
|
||||
}
|
||||
|
||||
fn qux() {
|
||||
let foo = false;
|
||||
match foo {
|
||||
|
@ -1,9 +1,18 @@
|
||||
error: this file contains an unclosed delimiter
|
||||
--> $DIR/brace-in-let-chain.rs:37:54
|
||||
--> $DIR/brace-in-let-chain.rs:58:54
|
||||
|
|
||||
LL | fn main() {
|
||||
| - unclosed delimiter
|
||||
...
|
||||
LL | fn quux() {
|
||||
| - unclosed delimiter
|
||||
...
|
||||
LL | fn foobar() {
|
||||
| - unclosed delimiter
|
||||
...
|
||||
LL | fn fubar() {
|
||||
| - unclosed delimiter
|
||||
...
|
||||
LL | fn qux() {
|
||||
| - unclosed delimiter
|
||||
...
|
||||
@ -24,6 +33,23 @@ LL | }
|
||||
LL | }
|
||||
| ^
|
||||
|
||||
error: found a `{` in the middle of a let-chain
|
||||
--> $DIR/brace-in-let-chain.rs:14:24
|
||||
|
|
||||
LL | && let () = () {
|
||||
| ^
|
||||
|
|
||||
note: you might have meant to continue the let-chain here
|
||||
--> $DIR/brace-in-let-chain.rs:15:9
|
||||
|
|
||||
LL | && let () = ()
|
||||
| ^^^^^^
|
||||
help: consider removing this brace to parse the `let` as part of the same chain
|
||||
|
|
||||
LL - && let () = () {
|
||||
LL + && let () = ()
|
||||
|
|
||||
|
||||
error: found a `{` in the middle of a let-chain
|
||||
--> $DIR/brace-in-let-chain.rs:6:24
|
||||
|
|
||||
@ -41,5 +67,5 @@ LL - && let () = () {
|
||||
LL + && let () = ()
|
||||
|
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to 3 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user