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);
| ^^ ^^
```
This commit is contained in:
parent
4a8c5b20c7
commit
8467ceff22
4 changed files with 19 additions and 6 deletions
|
|
@ -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)`
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue