-
Notifications
You must be signed in to change notification settings - Fork 12.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1557fb0
commit 6b95f31
Showing
12 changed files
with
267 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -338,6 +338,7 @@ symbols! { | |
forbid, | ||
format_args, | ||
format_args_nl, | ||
format_args_capture, | ||
from, | ||
From, | ||
from_desugaring, | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
fn main() { | ||
format!("{foo}"); //~ ERROR: there is no argument named `foo` | ||
|
||
// panic! doesn't hit format_args! unless there are two or more arguments. | ||
panic!("{foo} {bar}", bar=1); //~ ERROR: there is no argument named `foo` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
error: there is no argument named `foo` | ||
--> $DIR/feature-gate-format-args-capture.rs:2:14 | ||
| | ||
LL | format!("{foo}"); | ||
| ^^^^^ | ||
| | ||
= note: did you intend to capture a variable `foo` from the surrounding scope? | ||
= help: add `#![feature(format_args_capture)]` to the crate attributes to enable | ||
|
||
error: there is no argument named `foo` | ||
--> $DIR/feature-gate-format-args-capture.rs:5:13 | ||
| | ||
LL | panic!("{foo} {bar}", bar=1); | ||
| ^^^^^ | ||
| | ||
= note: did you intend to capture a variable `foo` from the surrounding scope? | ||
= help: add `#![feature(format_args_capture)]` to the crate attributes to enable | ||
|
||
error: aborting due to 2 previous errors | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
#![feature(format_args_capture)] | ||
|
||
fn main() { | ||
format!(concat!("{foo}")); //~ ERROR: there is no argument named `foo` | ||
format!(concat!("{ba", "r} {}"), 1); //~ ERROR: there is no argument named `bar` | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
error: there is no argument named `foo` | ||
--> $DIR/format-args-capture-macro-hygiene.rs:4:13 | ||
| | ||
LL | format!(concat!("{foo}")); | ||
| ^^^^^^^^^^^^^^^^ | ||
| | ||
= note: did you intend to capture a variable `foo` from the surrounding scope? | ||
= note: for hygiene reasons format_args! cannot capture variables when the format string is expanded from a macro | ||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) | ||
|
||
error: there is no argument named `bar` | ||
--> $DIR/format-args-capture-macro-hygiene.rs:5:13 | ||
| | ||
LL | format!(concat!("{ba", "r} {}"), 1); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
= note: did you intend to capture a variable `bar` from the surrounding scope? | ||
= note: for hygiene reasons format_args! cannot capture variables when the format string is expanded from a macro | ||
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) | ||
|
||
error: aborting due to 2 previous errors | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
#![feature(format_args_capture)] | ||
|
||
fn main() { | ||
format!("{} {foo} {} {bar} {}", 1, 2, 3); | ||
//~^ ERROR: cannot find value `foo` in this scope | ||
//~^^ ERROR: cannot find value `bar` in this scope | ||
|
||
format!("{foo}"); //~ ERROR: cannot find value `foo` in this scope | ||
|
||
format!("{valuea} {valueb}", valuea=5, valuec=7); | ||
//~^ ERROR cannot find value `valueb` in this scope | ||
//~^^ ERROR named argument never used | ||
|
||
format!(r##" | ||
{foo} | ||
"##); | ||
//~^^^^^ ERROR: cannot find value `foo` in this scope | ||
|
||
panic!("{foo} {bar}", bar=1); //~ ERROR: cannot find value `foo` in this scope | ||
} |
52 changes: 52 additions & 0 deletions
52
src/test/ui/fmt/format-args-capture-missing-variables.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
error: named argument never used | ||
--> $DIR/format-args-capture-missing-variables.rs:10:51 | ||
| | ||
LL | format!("{valuea} {valueb}", valuea=5, valuec=7); | ||
| ------------------- ^ named argument never used | ||
| | | ||
| formatting specifier missing | ||
|
||
error[E0425]: cannot find value `foo` in this scope | ||
--> $DIR/format-args-capture-missing-variables.rs:4:13 | ||
| | ||
LL | format!("{} {foo} {} {bar} {}", 1, 2, 3); | ||
| ^^^^^^^^^^^^^^^^^^^^^^ not found in this scope | ||
|
||
error[E0425]: cannot find value `bar` in this scope | ||
--> $DIR/format-args-capture-missing-variables.rs:4:13 | ||
| | ||
LL | format!("{} {foo} {} {bar} {}", 1, 2, 3); | ||
| ^^^^^^^^^^^^^^^^^^^^^^ not found in this scope | ||
|
||
error[E0425]: cannot find value `foo` in this scope | ||
--> $DIR/format-args-capture-missing-variables.rs:8:13 | ||
| | ||
LL | format!("{foo}"); | ||
| ^^^^^^^ not found in this scope | ||
|
||
error[E0425]: cannot find value `valueb` in this scope | ||
--> $DIR/format-args-capture-missing-variables.rs:10:13 | ||
| | ||
LL | format!("{valuea} {valueb}", valuea=5, valuec=7); | ||
| ^^^^^^^^^^^^^^^^^^^ not found in this scope | ||
|
||
error[E0425]: cannot find value `foo` in this scope | ||
--> $DIR/format-args-capture-missing-variables.rs:14:13 | ||
| | ||
LL | format!(r##" | ||
| _____________^ | ||
LL | | | ||
LL | | {foo} | ||
LL | | | ||
LL | | "##); | ||
| |_______^ not found in this scope | ||
|
||
error[E0425]: cannot find value `foo` in this scope | ||
--> $DIR/format-args-capture-missing-variables.rs:21:12 | ||
| | ||
LL | panic!("{foo} {bar}", bar=1); | ||
| ^^^^^^^^^^^^^ not found in this scope | ||
|
||
error: aborting due to 7 previous errors | ||
|
||
For more information about this error, try `rustc --explain E0425`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
// run-pass | ||
#![feature(format_args_capture)] | ||
|
||
fn main() { | ||
named_argument_takes_precedence_to_captured(); | ||
panic_with_single_argument_does_not_get_formatted(); | ||
panic_with_multiple_arguments_is_formatted(); | ||
formatting_parameters_can_be_captured(); | ||
} | ||
|
||
fn named_argument_takes_precedence_to_captured() { | ||
let foo = "captured"; | ||
let s = format!("{foo}", foo="named"); | ||
assert_eq!(&s, "named"); | ||
|
||
let s = format!("{foo}-{foo}-{foo}", foo="named"); | ||
assert_eq!(&s, "named-named-named"); | ||
|
||
let s = format!("{}-{bar}-{foo}", "positional", bar="named"); | ||
assert_eq!(&s, "positional-named-captured"); | ||
} | ||
|
||
fn panic_with_single_argument_does_not_get_formatted() { | ||
// panic! with a single argument does not perform string formatting. | ||
// RFC #2795 suggests that this may need to change so that captured arguments are formatted. | ||
// For stability reasons this will need to part of an edition change. | ||
|
||
let msg = std::panic::catch_unwind(|| { | ||
panic!("{foo}"); | ||
}).unwrap_err(); | ||
|
||
assert_eq!(msg.downcast_ref::<&str>(), Some(&"{foo}")) | ||
} | ||
|
||
fn panic_with_multiple_arguments_is_formatted() { | ||
let foo = "captured"; | ||
|
||
let msg = std::panic::catch_unwind(|| { | ||
panic!("{}-{bar}-{foo}", "positional", bar="named"); | ||
}).unwrap_err(); | ||
|
||
assert_eq!(msg.downcast_ref::<String>(), Some(&"positional-named-captured".to_string())) | ||
} | ||
|
||
fn formatting_parameters_can_be_captured() { | ||
let width = 9; | ||
let precision = 3; | ||
|
||
let x = 7.0; | ||
|
||
let s = format!("{x:width$}"); | ||
assert_eq!(&s, " 7"); | ||
|
||
let s = format!("{x:<width$}"); | ||
assert_eq!(&s, "7 "); | ||
|
||
let s = format!("{x:-^width$}"); | ||
assert_eq!(&s, "----7----"); | ||
|
||
let s = format!("{x:-^width$.precision$}"); | ||
assert_eq!(&s, "--7.000--"); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters