Skip to content

Commit 03eca71

Browse files
committed
Point at last valid token on failed expect_one_of
```rust error: expected one of `.`, `;`, `?`, `}`, or an operator, found `)` --> $DIR/token-error-correct-3.rs:29:9 | 25 | foo() | - expected one of `.`, `;`, `?`, `}`, or an operator after this ... 29 | } else { | ^ unexpected token ```
1 parent c62e532 commit 03eca71

File tree

8 files changed

+37
-20
lines changed

8 files changed

+37
-20
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -548,20 +548,20 @@ impl<'a> Parser<'a> {
548548
expected.dedup();
549549
let expect = tokens_to_string(&expected[..]);
550550
let actual = self.this_token_to_string();
551-
Err(self.fatal(
552-
&(if expected.len() > 1 {
553-
(format!("expected one of {}, found `{}`",
554-
expect,
555-
actual))
556-
} else if expected.is_empty() {
557-
(format!("unexpected token: `{}`",
558-
actual))
559-
} else {
560-
(format!("expected {}, found `{}`",
561-
expect,
562-
actual))
563-
})[..]
564-
))
551+
let (msg_exp, label_exp) = if expected.len() > 1 {
552+
(format!("expected one of {}, found `{}`", expect, actual),
553+
format!("expected one of {} after this", expect))
554+
} else if expected.is_empty() {
555+
(format!("unexpected token: `{}`", actual),
556+
"unexpected token after this".to_string())
557+
} else {
558+
(format!("expected {}, found `{}`", expect, actual),
559+
format!("expected {} after this", expect))
560+
};
561+
let mut err = self.fatal(&msg_exp);
562+
err.span_label(self.prev_span, &label_exp);
563+
err.span_label(self.span, &"unexpected token");
564+
Err(err)
565565
}
566566
}
567567

src/test/compile-fail/issue-10636-2.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,7 @@
1414
pub fn trace_option(option: Option<isize>) {
1515
option.map(|some| 42; //~ NOTE: unclosed delimiter
1616
//~^ ERROR: expected one of
17+
//~| NOTE: expected one of
18+
//~| NOTE: unexpected token
1719
} //~ ERROR: incorrect close delimiter
1820
//~^ ERROR: expected expression, found `)`

src/test/compile-fail/macro-incomplete-parse.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ macro_rules! ignored_item {
2020

2121
macro_rules! ignored_expr {
2222
() => ( 1, //~ ERROR expected one of `.`, `;`, `?`, `}`, or an operator, found `,`
23+
//~^ NOTE expected one of `.`, `;`, `?`, `}`, or an operator after this
24+
//~| NOTE unexpected token
2325
2 )
2426
}
2527

src/test/parse-fail/bounds-obj-parens.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@
1212

1313
type A = Box<(Fn(D::Error) -> E) + 'static + Send + Sync>; // OK (but see #39318)
1414

15-
FAIL //~ ERROR
15+
FAIL
16+
//~^ ERROR
17+
//~| ERROR

src/test/parse-fail/match-refactor-to-expr.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ fn main() {
1414
let foo =
1515
match //~ NOTE did you mean to remove this `match` keyword?
1616
Some(4).unwrap_or_else(5)
17-
; //~ ERROR expected one of `.`, `?`, `{`, or an operator, found `;`
17+
//~^ NOTE expected one of `.`, `?`, `{`, or an operator after this
18+
; //~ NOTE unexpected token
19+
//~^ ERROR expected one of `.`, `?`, `{`, or an operator, found `;`
1820

1921
println!("{}", foo)
2022
}

src/test/parse-fail/trailing-plus-in-bounds.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ fn main() {
1616
let x: Box<Debug+> = box 3 as Box<Debug+>; // Trailing `+` is OK
1717
}
1818

19-
FAIL //~ ERROR
19+
FAIL
20+
//~^ ERROR
21+
//~| ERROR

src/test/ui/resolve/token-error-correct-3.stderr

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,18 @@ error: expected one of `,`, `.`, `?`, or an operator, found `;`
1414
--> $DIR/token-error-correct-3.rs:23:35
1515
|
1616
23 | callback(path.as_ref(); //~ NOTE: unclosed delimiter
17-
| ^
17+
| -^ unexpected token
18+
| |
19+
| expected one of `,`, `.`, `?`, or an operator after this
1820

1921
error: expected one of `.`, `;`, `?`, `}`, or an operator, found `)`
2022
--> $DIR/token-error-correct-3.rs:29:9
2123
|
24+
25 | fs::create_dir_all(path.as_ref()).map(|()| true) //~ ERROR: mismatched types
25+
| - expected one of `.`, `;`, `?`, `}`, or an operator after this
26+
...
2227
29 | } else { //~ ERROR: incorrect close delimiter: `}`
23-
| ^
28+
| ^ unexpected token
2429

2530
error[E0425]: cannot find function `is_directory` in this scope
2631
--> $DIR/token-error-correct-3.rs:21:13

src/test/ui/resolve/token-error-correct.stderr

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ error: expected one of `)`, `,`, `.`, `<`, `?`, `break`, `continue`, `false`, `f
3232
--> $DIR/token-error-correct.rs:14:13
3333
|
3434
14 | foo(bar(;
35-
| ^
35+
| -^ unexpected token
36+
| |
37+
| expected one of `)`, `,`, `.`, `<`, `?`, `break`, `continue`, `false`, `for`, `if`, `loop`, `match`, `move`, `return`, `true`, `unsafe`, `while`, or an operator after this
3638

3739
error: expected expression, found `)`
3840
--> $DIR/token-error-correct.rs:23:1

0 commit comments

Comments
 (0)