Skip to content

Commit 4576668

Browse files
committed
Auto merge of #64080 - estebank:parse-format-comma, r=zackmdavis
Be accurate on `format!` parse error expectations Fix #57277.
2 parents a6946a8 + 4dec571 commit 4576668

File tree

5 files changed

+18
-10
lines changed

5 files changed

+18
-10
lines changed

src/libsyntax_ext/format.rs

+12-4
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,23 @@ fn parse_args<'a>(
138138
}
139139

140140
let fmtstr = p.parse_expr()?;
141+
let mut first = true;
141142
let mut named = false;
142143

143144
while p.token != token::Eof {
144145
if !p.eat(&token::Comma) {
145-
let mut err = ecx.struct_span_err(p.token.span, "expected token: `,`");
146-
err.span_label(p.token.span, "expected `,`");
147-
p.maybe_annotate_with_ascription(&mut err, false);
148-
return Err(err);
146+
if first {
147+
// After `format!(""` we always expect *only* a comma...
148+
let mut err = ecx.struct_span_err(p.token.span, "expected token: `,`");
149+
err.span_label(p.token.span, "expected `,`");
150+
p.maybe_annotate_with_ascription(&mut err, false);
151+
return Err(err);
152+
} else {
153+
// ...after that delegate to `expect` to also include the other expected tokens.
154+
return Err(p.expect(&token::Comma).err().unwrap());
155+
}
149156
}
157+
first = false;
150158
if p.token == token::Eof {
151159
break;
152160
} // accept trailing commas
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
fn main() {
22
format!(); //~ ERROR requires at least a format string argument
33
format!("" 1); //~ ERROR expected token: `,`
4-
format!("", 1 1); //~ ERROR expected token: `,`
4+
format!("", 1 1); //~ ERROR expected one of
55
}

src/test/ui/codemap_tests/bad-format-args.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@ error: expected token: `,`
1212
LL | format!("" 1);
1313
| ^ expected `,`
1414

15-
error: expected token: `,`
15+
error: expected one of `,`, `.`, `?`, or an operator, found `1`
1616
--> $DIR/bad-format-args.rs:4:19
1717
|
1818
LL | format!("", 1 1);
19-
| ^ expected `,`
19+
| ^ expected one of `,`, `.`, `?`, or an operator here
2020

2121
error: aborting due to 3 previous errors
2222

src/test/ui/type/ascription/issue-54516.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ use std::collections::BTreeMap;
22

33
fn main() {
44
println!("{}", std::mem:size_of::<BTreeMap<u32, u32>>());
5-
//~^ ERROR expected token: `,`
5+
//~^ ERROR expected one of
66
}

src/test/ui/type/ascription/issue-54516.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error: expected token: `,`
1+
error: expected one of `!`, `,`, or `::`, found `(`
22
--> $DIR/issue-54516.rs:4:58
33
|
44
LL | println!("{}", std::mem:size_of::<BTreeMap<u32, u32>>());
5-
| - ^ expected `,`
5+
| - ^ expected one of `!`, `,`, or `::` here
66
| |
77
| help: maybe write a path separator here: `::`
88
|

0 commit comments

Comments
 (0)