diff options
| author | Mark Rousskov <mark.simulacrum@gmail.com> | 2018-07-26 09:18:30 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-07-26 09:18:30 -0600 |
| commit | 2aec4e882c6136ff34d931043fb16bd35abedc3e (patch) | |
| tree | e0f5623aadc727d05f8e28de9250be4389d84efe /src/test | |
| parent | 662fb069fd45d44c5828c335690598d712226325 (diff) | |
| parent | 9a893cc2b82ac6259aead1319758404b80b8a959 (diff) | |
| download | rust-2aec4e882c6136ff34d931043fb16bd35abedc3e.tar.gz rust-2aec4e882c6136ff34d931043fb16bd35abedc3e.zip | |
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
| ^^^^^^ ^^
```
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/ifmt-bad-arg.rs (renamed from src/test/compile-fail/ifmt-bad-arg.rs) | 7 | ||||
| -rw-r--r-- | src/test/ui/ifmt-bad-arg.stderr | 208 | ||||
| -rw-r--r-- | src/test/ui/macros/format-foreign.rs | 5 | ||||
| -rw-r--r-- | src/test/ui/macros/format-foreign.stderr | 41 | ||||
| -rw-r--r-- | src/test/ui/macros/format-unused-lables.stderr | 10 |
5 files changed, 258 insertions, 13 deletions
diff --git a/src/test/compile-fail/ifmt-bad-arg.rs b/src/test/ui/ifmt-bad-arg.rs index afe9bc152a3..bbd75f30d6c 100644 --- a/src/test/compile-fail/ifmt-bad-arg.rs +++ b/src/test/ui/ifmt-bad-arg.rs @@ -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` } diff --git a/src/test/ui/ifmt-bad-arg.stderr b/src/test/ui/ifmt-bad-arg.stderr new file mode 100644 index 00000000000..c8fd8bad19b --- /dev/null +++ b/src/test/ui/ifmt-bad-arg.stderr @@ -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 + diff --git a/src/test/ui/macros/format-foreign.rs b/src/test/ui/macros/format-foreign.rs index ec0eaed43ae..33401424c9a 100644 --- a/src/test/ui/macros/format-foreign.rs +++ b/src/test/ui/macros/format-foreign.rs @@ -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. diff --git a/src/test/ui/macros/format-foreign.stderr b/src/test/ui/macros/format-foreign.stderr index 401b2f6d67e..5e76c0a322e 100644 --- a/src/test/ui/macros/format-foreign.stderr +++ b/src/test/ui/macros/format-foreign.stderr @@ -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 diff --git a/src/test/ui/macros/format-unused-lables.stderr b/src/test/ui/macros/format-unused-lables.stderr index f764190438f..81171a1ed01 100644 --- a/src/test/ui/macros/format-unused-lables.stderr +++ b/src/test/ui/macros/format-unused-lables.stderr @@ -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= |
