Rollup merge of #65746 - estebank:newcomer-format, r=Centril

Tweak format string error to point at arguments always

Add secondary span labels with no text to make it clear when there's a
mismatch bewteen the positional arguments in a format string and the
arguments to the macro. This shouldn't affect experienced users, but it
should make it easier for newcomers to more clearly understand how
`format!()` and `println!()` are supposed to be used.

```
error: 2 positional arguments in format string, but there is 1 argument
 --> file8.rs:2:14
  |
2 |     format!("{} {}", 1);
  |              ^^ ^^   -
```

instead of

```
error: 2 positional arguments in format string, but there is 1 argument
 --> file8.rs:2:14
  |
2 |     format!("{} {}", 1);
  |              ^^ ^^
```

r? @Centril
This commit is contained in:
Mazdak Farrokhzad 2019-10-24 20:20:05 +02:00 committed by GitHub
commit 1e4a2ee6d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 6 deletions

View file

@ -278,7 +278,7 @@ impl<'a, 'b> Context<'a, 'b> {
/// format string.
fn report_invalid_references(&self, numbered_position_args: bool) {
let mut e;
let sp = if self.is_literal {
let sp = if self.is_literal { // Point at the formatting arguments.
MultiSpan::from_spans(self.arg_spans.clone())
} else {
MultiSpan::from_span(self.fmtsp)
@ -304,6 +304,9 @@ impl<'a, 'b> Context<'a, 'b> {
self.describe_num_args(),
),
);
for arg in &self.args { // Point at the arguments that will be formatted.
e.span_label(arg.span, "");
}
} else {
let (mut refs, spans): (Vec<_>, Vec<_>) = refs.unzip();
// Avoid `invalid reference to positional arguments 7 and 7 (there is 1 argument)`

View file

@ -48,4 +48,6 @@ fn main() {
"###);
//~^^^ ERROR invalid format string: unmatched `}` found
println!("{} {} {}", 1, 2);
//~^ ERROR 3 positional arguments in format string, but there are 2 arguments
}

View file

@ -107,5 +107,11 @@ LL | }
|
= note: if you intended to print `}`, you can escape it using `}}`
error: aborting due to 12 previous errors
error: 3 positional arguments in format string, but there are 2 arguments
--> $DIR/format-string-error.rs:51:15
|
LL | println!("{} {} {}", 1, 2);
| ^^ ^^ ^^ - -
error: aborting due to 13 previous errors

View file

@ -224,8 +224,9 @@ error: 4 positional arguments in format string, but there are 3 arguments
--> $DIR/ifmt-bad-arg.rs:78:15
|
LL | println!("{} {:.*} {}", 1, 3.2, 4);
| ^^ ^^--^ ^^ --- this parameter corresponds to the precision flag
| |
| ^^ ^^--^ ^^ - --- -
| | |
| | this parameter corresponds to the precision flag
| this precision flag adds an extra required argument at position 1, which is why there are 4 arguments expected
|
= note: positional arguments are zero-based
@ -235,8 +236,9 @@ error: 4 positional arguments in format string, but there are 3 arguments
--> $DIR/ifmt-bad-arg.rs:81:15
|
LL | println!("{} {:07$.*} {}", 1, 3.2, 4);
| ^^ ^^^----^ ^^ --- this parameter corresponds to the precision flag
| | |
| ^^ ^^^----^ ^^ - --- -
| | | |
| | | this parameter corresponds to the precision flag
| | this precision flag adds an extra required argument at position 1, which is why there are 4 arguments expected
| this width flag expects an `usize` argument at position 7, but there are 3 arguments
|