Skip to content

Commit 36baa81

Browse files
committed
Add label to primary span in some parse errors
1 parent ba7039c commit 36baa81

File tree

5 files changed

+68
-25
lines changed

5 files changed

+68
-25
lines changed

src/libsyntax/parse/parser.rs

Lines changed: 64 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,7 +1487,10 @@ impl<'a> Parser<'a> {
14871487
}
14881488
_ => {
14891489
let token_str = self.this_token_to_string();
1490-
return Err(self.fatal(&format!("expected `;` or `{{`, found `{}`", token_str)));
1490+
let mut err = self.fatal(&format!("expected `;` or `{{`, found `{}`",
1491+
token_str));
1492+
err.span_label(self.span, "expected `;` or `{`");
1493+
return Err(err);
14911494
}
14921495
};
14931496
(ident, ast::TraitItemKind::Method(sig, body), generics)
@@ -2218,7 +2221,12 @@ impl<'a> Parser<'a> {
22182221
TokenTree::Delimited(_, delimited) => Ok((delim, delimited.stream().into())),
22192222
_ => unreachable!(),
22202223
},
2221-
_ => Err(self.fatal("expected open delimiter")),
2224+
_ => {
2225+
let msg = "expected open delimiter";
2226+
let mut err = self.fatal(msg);
2227+
err.span_label(self.span, msg);
2228+
Err(err)
2229+
}
22222230
}
22232231
}
22242232

@@ -2351,7 +2359,10 @@ impl<'a> Parser<'a> {
23512359
if self.eat_keyword(keywords::Loop) {
23522360
return self.parse_loop_expr(Some(label), lo, attrs)
23532361
}
2354-
return Err(self.fatal("expected `while`, `for`, or `loop` after a label"))
2362+
let msg = "expected `while`, `for`, or `loop` after a label";
2363+
let mut err = self.fatal(msg);
2364+
err.span_label(self.span, msg);
2365+
return Err(err);
23552366
}
23562367
if self.eat_keyword(keywords::Loop) {
23572368
let lo = self.prev_span;
@@ -2410,6 +2421,7 @@ impl<'a> Parser<'a> {
24102421
// Catch this syntax error here, instead of in `parse_ident`, so
24112422
// that we can explicitly mention that let is not to be used as an expression
24122423
let mut db = self.fatal("expected expression, found statement (`let`)");
2424+
db.span_label(self.span, "expected expression");
24132425
db.note("variable declaration using `let` is a statement");
24142426
return Err(db);
24152427
} else if self.token.is_path_start() {
@@ -2445,7 +2457,9 @@ impl<'a> Parser<'a> {
24452457
self.cancel(&mut err);
24462458
let msg = format!("expected expression, found {}",
24472459
self.this_token_descr());
2448-
return Err(self.fatal(&msg));
2460+
let mut err = self.fatal(&msg);
2461+
err.span_label(self.span, "expected expression");
2462+
return Err(err);
24492463
}
24502464
}
24512465
}
@@ -2735,7 +2749,9 @@ impl<'a> Parser<'a> {
27352749
self.look_ahead(1, |t| t.is_ident()) => {
27362750
self.bump();
27372751
let name = match self.token { token::Ident(ident) => ident, _ => unreachable!() };
2738-
self.fatal(&format!("unknown macro variable `{}`", name)).emit();
2752+
let mut err = self.fatal(&format!("unknown macro variable `{}`", name));
2753+
err.span_label(self.span, "unknown macro variable");
2754+
err.emit();
27392755
return
27402756
}
27412757
token::Interpolated(ref nt) => {
@@ -3760,7 +3776,10 @@ impl<'a> Parser<'a> {
37603776
self.expect_and()?;
37613777
let mutbl = self.parse_mutability();
37623778
if let token::Lifetime(ident) = self.token {
3763-
return Err(self.fatal(&format!("unexpected lifetime `{}` in pattern", ident)));
3779+
let mut err = self.fatal(&format!("unexpected lifetime `{}` in pattern",
3780+
ident));
3781+
err.span_label(self.span, "unexpected lifetime");
3782+
return Err(err);
37643783
}
37653784
let subpat = self.parse_pat()?;
37663785
pat = PatKind::Ref(subpat, mutbl);
@@ -3843,7 +3862,10 @@ impl<'a> Parser<'a> {
38433862
}
38443863
token::OpenDelim(token::Brace) => {
38453864
if qself.is_some() {
3846-
return Err(self.fatal("unexpected `{` after qualified path"));
3865+
let msg = "unexpected `{` after qualified path";
3866+
let mut err = self.fatal(msg);
3867+
err.span_label(self.span, msg);
3868+
return Err(err);
38473869
}
38483870
// Parse struct pattern
38493871
self.bump();
@@ -3857,7 +3879,10 @@ impl<'a> Parser<'a> {
38573879
}
38583880
token::OpenDelim(token::Paren) => {
38593881
if qself.is_some() {
3860-
return Err(self.fatal("unexpected `(` after qualified path"));
3882+
let msg = "unexpected `(` after qualified path";
3883+
let mut err = self.fatal(msg);
3884+
err.span_label(self.span, msg);
3885+
return Err(err);
38613886
}
38623887
// Parse tuple struct or enum pattern
38633888
self.bump();
@@ -3889,7 +3914,9 @@ impl<'a> Parser<'a> {
38893914
Err(mut err) => {
38903915
self.cancel(&mut err);
38913916
let msg = format!("expected pattern, found {}", self.this_token_descr());
3892-
return Err(self.fatal(&msg));
3917+
let mut err = self.fatal(&msg);
3918+
err.span_label(self.span, "expected pattern");
3919+
return Err(err);
38933920
}
38943921
}
38953922
}
@@ -4289,9 +4316,11 @@ impl<'a> Parser<'a> {
42894316
""
42904317
};
42914318
let tok_str = self.this_token_to_string();
4292-
return Err(self.fatal(&format!("expected {}`(` or `{{`, found `{}`",
4293-
ident_str,
4294-
tok_str)))
4319+
let mut err = self.fatal(&format!("expected {}`(` or `{{`, found `{}`",
4320+
ident_str,
4321+
tok_str));
4322+
err.span_label(self.span, format!("expected {}`(` or `{{`", ident_str));
4323+
return Err(err)
42954324
},
42964325
};
42974326

@@ -5598,8 +5627,12 @@ impl<'a> Parser<'a> {
55985627
body
55995628
} else {
56005629
let token_str = self.this_token_to_string();
5601-
return Err(self.fatal(&format!("expected `where`, `{{`, `(`, or `;` after struct \
5602-
name, found `{}`", token_str)))
5630+
let mut err = self.fatal(&format!(
5631+
"expected `where`, `{{`, `(`, or `;` after struct name, found `{}`",
5632+
token_str
5633+
));
5634+
err.span_label(self.span, "expected `where`, `{`, `(`, or `;` after struct name");
5635+
return Err(err);
56035636
};
56045637

56055638
Ok((class_name, ItemKind::Struct(vdata, generics), None))
@@ -5618,8 +5651,10 @@ impl<'a> Parser<'a> {
56185651
VariantData::Struct(self.parse_record_struct_body()?, ast::DUMMY_NODE_ID)
56195652
} else {
56205653
let token_str = self.this_token_to_string();
5621-
return Err(self.fatal(&format!("expected `where` or `{{` after union \
5622-
name, found `{}`", token_str)))
5654+
let mut err = self.fatal(&format!(
5655+
"expected `where` or `{{` after union name, found `{}`", token_str));
5656+
err.span_label(self.span, "expected `where` or `{` after union name");
5657+
return Err(err);
56235658
};
56245659

56255660
Ok((class_name, ItemKind::Union(vdata, generics), None))
@@ -5666,9 +5701,10 @@ impl<'a> Parser<'a> {
56665701
self.eat(&token::CloseDelim(token::Brace));
56675702
} else {
56685703
let token_str = self.this_token_to_string();
5669-
return Err(self.fatal(&format!("expected `where`, or `{{` after struct \
5670-
name, found `{}`",
5671-
token_str)));
5704+
let mut err = self.fatal(&format!(
5705+
"expected `where`, or `{{` after struct name, found `{}`", token_str));
5706+
err.span_label(self.span, "expected `where`, or `{` after struct name");
5707+
return Err(err);
56725708
}
56735709

56745710
Ok(fields)
@@ -5841,9 +5877,11 @@ impl<'a> Parser<'a> {
58415877
if !self.eat(term) {
58425878
let token_str = self.this_token_to_string();
58435879
let mut err = self.fatal(&format!("expected item, found `{}`", token_str));
5844-
let msg = "consider removing this semicolon";
58455880
if token_str == ";" {
5881+
let msg = "consider removing this semicolon";
58465882
err.span_suggestion_short(self.span, msg, "".to_string());
5883+
} else {
5884+
err.span_label(self.span, "expected item");
58475885
}
58485886
return Err(err);
58495887
}
@@ -7000,7 +7038,12 @@ impl<'a> Parser<'a> {
70007038
self.expect_no_suffix(sp, "string literal", suf);
70017039
Ok((s, style))
70027040
}
7003-
_ => Err(self.fatal("expected string literal"))
7041+
_ => {
7042+
let msg = "expected string literal";
7043+
let mut err = self.fatal(msg);
7044+
err.span_label(self.span, msg);
7045+
Err(err)
7046+
}
70047047
}
70057048
}
70067049
}

src/test/ui/cross-file-errors/main.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error: expected expression, found `_`
22
--> $DIR/underscore.rs:18:9
33
|
44
LL | _
5-
| ^
5+
| ^ expected expression
66
|
77
::: $DIR/main.rs:15:5
88
|

src/test/ui/macro-context.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ error: expected expression, found reserved keyword `typeof`
3838
--> $DIR/macro-context.rs:13:17
3939
|
4040
LL | () => ( i ; typeof ); //~ ERROR expected expression, found reserved keyword `typeof`
41-
| ^^^^^^
41+
| ^^^^^^ expected expression
4242
...
4343
LL | m!();
4444
| ----- in this macro invocation

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ error: expected expression, found `;`
2626
--> $DIR/token-error-correct.rs:14:13
2727
|
2828
LL | foo(bar(;
29-
| ^
29+
| ^ expected expression
3030

3131
error: aborting due to 3 previous errors
3232

src/test/ui/token/issue-10636-2.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ error: expected expression, found `)`
2020
--> $DIR/issue-10636-2.rs:18:1
2121
|
2222
LL | } //~ ERROR: incorrect close delimiter
23-
| ^
23+
| ^ expected expression
2424

2525
error[E0601]: main function not found
2626

0 commit comments

Comments
 (0)