Rollup merge of #52649 - estebank:fmt-span, r=oli-obk
Point spans to inner elements of format strings
- Point at missing positional specifiers in string literal
```
error: invalid reference to positional arguments 3, 4 and 5 (there are 3 arguments)
--> $DIR/ifmt-bad-arg.rs:34:38
|
LL | format!("{name} {value} {} {} {} {} {} {}", 0, name=1, value=2);
| ^^ ^^ ^^
|
= note: positional arguments are zero-based
```
- Point at named formatting specifier in string literal
```
error: there is no argument named `foo`
--> $DIR/ifmt-bad-arg.rs:37:17
|
LL | format!("{} {foo} {} {bar} {}", 1, 2, 3);
| ^^^^^
```
- Update label for formatting string in "multiple unused formatting arguments" to be more correct
```
error: multiple unused formatting arguments
--> $DIR/ifmt-bad-arg.rs:42:17
|
LL | format!("", 1, 2); //~ ERROR: multiple unused formatting arguments
| -- ^ ^
| |
| multiple missing formatting specifiers
```
- When using `printf` string formatting, provide a structured suggestion instead of a note
```
error: multiple unused formatting arguments
--> $DIR/format-foreign.rs:12:30
|
LL | println!("%.*3$s %s!/n", "Hello,", "World", 4); //~ ERROR multiple unused formatting arguments
| -------------- ^^^^^^^^ ^^^^^^^ ^
| |
| multiple missing formatting specifiers
|
= note: printf formatting not supported; see the documentation for `std::fmt`
help: format specifiers in Rust are written using `{}`
|
LL | println!("{:.2$} {}!/n", "Hello,", "World", 4); //~ ERROR multiple unused formatting arguments
| ^^^^^^ ^^
```
This commit is contained in:
commit
2aec4e882c
8 changed files with 494 additions and 116 deletions
|
|
@ -64,4 +64,11 @@ fn main() {
|
|||
format!("foo }"); //~ ERROR: unmatched `}` found
|
||||
|
||||
format!("foo %s baz", "bar"); //~ ERROR: argument never used
|
||||
|
||||
format!(r##"
|
||||
|
||||
{foo}
|
||||
|
||||
"##);
|
||||
//~^^^ ERROR: there is no argument named `foo`
|
||||
}
|
||||
208
src/test/ui/ifmt-bad-arg.stderr
Normal file
208
src/test/ui/ifmt-bad-arg.stderr
Normal file
|
|
@ -0,0 +1,208 @@
|
|||
error: 1 positional argument in format string, but no arguments were given
|
||||
--> $DIR/ifmt-bad-arg.rs:16:14
|
||||
|
|
||||
LL | format!("{}");
|
||||
| ^^
|
||||
|
||||
error: invalid reference to positional argument 1 (there is 1 argument)
|
||||
--> $DIR/ifmt-bad-arg.rs:19:14
|
||||
|
|
||||
LL | format!("{1}", 1);
|
||||
| ^^^
|
||||
|
|
||||
= note: positional arguments are zero-based
|
||||
|
||||
error: argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:19:20
|
||||
|
|
||||
LL | format!("{1}", 1);
|
||||
| ----- ^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: 2 positional arguments in format string, but no arguments were given
|
||||
--> $DIR/ifmt-bad-arg.rs:23:14
|
||||
|
|
||||
LL | format!("{} {}");
|
||||
| ^^ ^^
|
||||
|
||||
error: invalid reference to positional argument 1 (there is 1 argument)
|
||||
--> $DIR/ifmt-bad-arg.rs:26:18
|
||||
|
|
||||
LL | format!("{0} {1}", 1);
|
||||
| ^^^
|
||||
|
|
||||
= note: positional arguments are zero-based
|
||||
|
||||
error: invalid reference to positional argument 2 (there are 2 arguments)
|
||||
--> $DIR/ifmt-bad-arg.rs:29:22
|
||||
|
|
||||
LL | format!("{0} {1} {2}", 1, 2);
|
||||
| ^^^
|
||||
|
|
||||
= note: positional arguments are zero-based
|
||||
|
||||
error: invalid reference to positional argument 2 (there are 2 arguments)
|
||||
--> $DIR/ifmt-bad-arg.rs:32:28
|
||||
|
|
||||
LL | format!("{} {value} {} {}", 1, value=2);
|
||||
| ^^
|
||||
|
|
||||
= note: positional arguments are zero-based
|
||||
|
||||
error: invalid reference to positional arguments 3, 4 and 5 (there are 3 arguments)
|
||||
--> $DIR/ifmt-bad-arg.rs:34:38
|
||||
|
|
||||
LL | format!("{name} {value} {} {} {} {} {} {}", 0, name=1, value=2);
|
||||
| ^^ ^^ ^^
|
||||
|
|
||||
= note: positional arguments are zero-based
|
||||
|
||||
error: there is no argument named `foo`
|
||||
--> $DIR/ifmt-bad-arg.rs:37:17
|
||||
|
|
||||
LL | format!("{} {foo} {} {bar} {}", 1, 2, 3);
|
||||
| ^^^^^
|
||||
|
||||
error: there is no argument named `bar`
|
||||
--> $DIR/ifmt-bad-arg.rs:37:26
|
||||
|
|
||||
LL | format!("{} {foo} {} {bar} {}", 1, 2, 3);
|
||||
| ^^^^^
|
||||
|
||||
error: there is no argument named `foo`
|
||||
--> $DIR/ifmt-bad-arg.rs:41:14
|
||||
|
|
||||
LL | format!("{foo}"); //~ ERROR: no argument named `foo`
|
||||
| ^^^^^
|
||||
|
||||
error: multiple unused formatting arguments
|
||||
--> $DIR/ifmt-bad-arg.rs:42:17
|
||||
|
|
||||
LL | format!("", 1, 2); //~ ERROR: multiple unused formatting arguments
|
||||
| -- ^ ^
|
||||
| |
|
||||
| multiple missing formatting specifiers
|
||||
|
||||
error: argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:43:22
|
||||
|
|
||||
LL | format!("{}", 1, 2); //~ ERROR: argument never used
|
||||
| ---- ^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:44:20
|
||||
|
|
||||
LL | format!("{1}", 1, 2); //~ ERROR: argument never used
|
||||
| ----- ^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: named argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:45:26
|
||||
|
|
||||
LL | format!("{}", 1, foo=2); //~ ERROR: named argument never used
|
||||
| ---- ^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:46:22
|
||||
|
|
||||
LL | format!("{foo}", 1, foo=2); //~ ERROR: argument never used
|
||||
| ------- ^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: named argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:47:21
|
||||
|
|
||||
LL | format!("", foo=2); //~ ERROR: named argument never used
|
||||
| -- ^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: multiple unused formatting arguments
|
||||
--> $DIR/ifmt-bad-arg.rs:48:32
|
||||
|
|
||||
LL | format!("{} {}", 1, 2, foo=1, bar=2); //~ ERROR: multiple unused formatting arguments
|
||||
| ------- ^ ^
|
||||
| |
|
||||
| multiple missing formatting specifiers
|
||||
|
||||
error: duplicate argument named `foo`
|
||||
--> $DIR/ifmt-bad-arg.rs:50:33
|
||||
|
|
||||
LL | format!("{foo}", foo=1, foo=2); //~ ERROR: duplicate argument
|
||||
| ^
|
||||
|
|
||||
note: previously here
|
||||
--> $DIR/ifmt-bad-arg.rs:50:26
|
||||
|
|
||||
LL | format!("{foo}", foo=1, foo=2); //~ ERROR: duplicate argument
|
||||
| ^
|
||||
|
||||
error: expected ident, positional arguments cannot follow named arguments
|
||||
--> $DIR/ifmt-bad-arg.rs:51:24
|
||||
|
|
||||
LL | format!("", foo=1, 2); //~ ERROR: positional arguments cannot follow
|
||||
| ^
|
||||
|
||||
error: there is no argument named `valueb`
|
||||
--> $DIR/ifmt-bad-arg.rs:55:23
|
||||
|
|
||||
LL | format!("{valuea} {valueb}", valuea=5, valuec=7);
|
||||
| ^^^^^^^^
|
||||
|
||||
error: named argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:55:51
|
||||
|
|
||||
LL | format!("{valuea} {valueb}", valuea=5, valuec=7);
|
||||
| ------------------- ^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: invalid format string: expected `'}'` but string was terminated
|
||||
--> $DIR/ifmt-bad-arg.rs:61:15
|
||||
|
|
||||
LL | format!("{"); //~ ERROR: expected `'}'` but string was terminated
|
||||
| ^ expected `'}'` in format string
|
||||
|
|
||||
= note: if you intended to print `{`, you can escape it using `{{`
|
||||
|
||||
error: invalid format string: unmatched `}` found
|
||||
--> $DIR/ifmt-bad-arg.rs:63:18
|
||||
|
|
||||
LL | format!("foo } bar"); //~ ERROR: unmatched `}` found
|
||||
| ^ unmatched `}` in format string
|
||||
|
|
||||
= note: if you intended to print `}`, you can escape it using `}}`
|
||||
|
||||
error: invalid format string: unmatched `}` found
|
||||
--> $DIR/ifmt-bad-arg.rs:64:18
|
||||
|
|
||||
LL | format!("foo }"); //~ ERROR: unmatched `}` found
|
||||
| ^ unmatched `}` in format string
|
||||
|
|
||||
= note: if you intended to print `}`, you can escape it using `}}`
|
||||
|
||||
error: argument never used
|
||||
--> $DIR/ifmt-bad-arg.rs:66:27
|
||||
|
|
||||
LL | format!("foo %s baz", "bar"); //~ ERROR: argument never used
|
||||
| -- ^^^^^
|
||||
| |
|
||||
| help: format specifiers use curly braces: `{}`
|
||||
|
|
||||
= note: printf formatting not supported; see the documentation for `std::fmt`
|
||||
|
||||
error: there is no argument named `foo`
|
||||
--> $DIR/ifmt-bad-arg.rs:70:9
|
||||
|
|
||||
LL | {foo}
|
||||
| ^^^^^
|
||||
|
||||
error: aborting due to 27 previous errors
|
||||
|
||||
|
|
@ -11,6 +11,11 @@
|
|||
fn main() {
|
||||
println!("%.*3$s %s!\n", "Hello,", "World", 4); //~ ERROR multiple unused formatting arguments
|
||||
println!("%1$*2$.*3$f", 123.456); //~ ERROR never used
|
||||
println!(r###"%.*3$s
|
||||
%s!\n
|
||||
"###, "Hello,", "World", 4);
|
||||
//~^ ERROR multiple unused formatting arguments
|
||||
// correctly account for raw strings in inline suggestions
|
||||
|
||||
// This should *not* produce hints, on the basis that there's equally as
|
||||
// many "correct" format specifiers. It's *probably* just an actual typo.
|
||||
|
|
|
|||
|
|
@ -4,29 +4,52 @@ error: multiple unused formatting arguments
|
|||
LL | println!("%.*3$s %s!/n", "Hello,", "World", 4); //~ ERROR multiple unused formatting arguments
|
||||
| -------------- ^^^^^^^^ ^^^^^^^ ^
|
||||
| |
|
||||
| multiple missing formatting arguments
|
||||
| multiple missing formatting specifiers
|
||||
|
|
||||
= help: `%.*3$s` should be written as `{:.2$}`
|
||||
= help: `%s` should be written as `{}`
|
||||
= note: printf formatting not supported; see the documentation for `std::fmt`
|
||||
help: format specifiers use curly braces
|
||||
|
|
||||
LL | println!("{:.2$} {}!/n", "Hello,", "World", 4); //~ ERROR multiple unused formatting arguments
|
||||
| ^^^^^^ ^^
|
||||
|
||||
error: argument never used
|
||||
--> $DIR/format-foreign.rs:13:29
|
||||
|
|
||||
LL | println!("%1$*2$.*3$f", 123.456); //~ ERROR never used
|
||||
| ^^^^^^^
|
||||
| ----------- ^^^^^^^
|
||||
| |
|
||||
| help: format specifiers use curly braces: `{0:1$.2$}`
|
||||
|
|
||||
= help: `%1$*2$.*3$f` should be written as `{0:1$.2$}`
|
||||
= note: printf formatting not supported; see the documentation for `std::fmt`
|
||||
|
||||
error: multiple unused formatting arguments
|
||||
--> $DIR/format-foreign.rs:16:7
|
||||
|
|
||||
LL | println!(r###"%.*3$s
|
||||
| ______________-
|
||||
LL | | %s!/n
|
||||
LL | | "###, "Hello,", "World", 4);
|
||||
| | - ^^^^^^^^ ^^^^^^^ ^
|
||||
| |____|
|
||||
| multiple missing formatting specifiers
|
||||
|
|
||||
= note: printf formatting not supported; see the documentation for `std::fmt`
|
||||
help: format specifiers use curly braces
|
||||
|
|
||||
LL | println!(r###"{:.2$}
|
||||
LL | {}!/n
|
||||
|
|
||||
|
||||
error: argument never used
|
||||
--> $DIR/format-foreign.rs:17:30
|
||||
--> $DIR/format-foreign.rs:22:30
|
||||
|
|
||||
LL | println!("{} %f", "one", 2.0); //~ ERROR never used
|
||||
| ^^^
|
||||
| ------- ^^^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: named argument never used
|
||||
--> $DIR/format-foreign.rs:19:39
|
||||
--> $DIR/format-foreign.rs:24:39
|
||||
|
|
||||
LL | println!("Hi there, $NAME.", NAME="Tim"); //~ ERROR never used
|
||||
| ^^^^^
|
||||
|
|
@ -34,5 +57,5 @@ LL | println!("Hi there, $NAME.", NAME="Tim"); //~ ERROR never used
|
|||
= help: `$NAME` should be written as `{NAME}`
|
||||
= note: shell formatting not supported; see the documentation for `std::fmt`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
|
|
|
|||
|
|
@ -4,13 +4,13 @@ error: multiple unused formatting arguments
|
|||
LL | println!("Test", 123, 456, 789);
|
||||
| ------ ^^^ ^^^ ^^^
|
||||
| |
|
||||
| multiple missing formatting arguments
|
||||
| multiple missing formatting specifiers
|
||||
|
||||
error: multiple unused formatting arguments
|
||||
--> $DIR/format-unused-lables.rs:16:9
|
||||
|
|
||||
LL | println!("Test2",
|
||||
| ------- multiple missing formatting arguments
|
||||
| ------- multiple missing formatting specifiers
|
||||
LL | 123, //~ ERROR multiple unused formatting arguments
|
||||
| ^^^
|
||||
LL | 456,
|
||||
|
|
@ -22,13 +22,15 @@ error: named argument never used
|
|||
--> $DIR/format-unused-lables.rs:21:35
|
||||
|
|
||||
LL | println!("Some stuff", UNUSED="args"); //~ ERROR named argument never used
|
||||
| ^^^^^^
|
||||
| ------------ ^^^^^^
|
||||
| |
|
||||
| formatting specifier missing
|
||||
|
||||
error: multiple unused formatting arguments
|
||||
--> $DIR/format-unused-lables.rs:24:9
|
||||
|
|
||||
LL | println!("Some more $STUFF",
|
||||
| ------------------ multiple missing formatting arguments
|
||||
| ------------------ multiple missing formatting specifiers
|
||||
LL | "woo!", //~ ERROR multiple unused formatting arguments
|
||||
| ^^^^^^
|
||||
LL | STUFF=
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue