Skip to content

Commit e656e52

Browse files
committed
Suggest examples of format specifiers in error messages
1 parent beeb8e3 commit e656e52

File tree

3 files changed

+118
-2
lines changed

3 files changed

+118
-2
lines changed

compiler/rustc_builtin_macros/src/format.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -758,8 +758,31 @@ fn report_missing_placeholders(
758758
check_foreign!(shell);
759759
}
760760
}
761-
if !found_foreign && unused.len() == 1 {
762-
diag.span_label(fmt_span, "formatting specifier missing");
761+
if !found_foreign {
762+
if unused.len() == 1 {
763+
diag.span_label(fmt_span, "formatting specifier missing");
764+
}
765+
if used.iter().all(|used| !used) {
766+
diag.note("format specifiers use curly braces: `{}`");
767+
}
768+
769+
let mut suggest_fixed_fmt = format!("\"{}", &fmt_str[..fmt_str.len() - 1]);
770+
for _ in &unused {
771+
suggest_fixed_fmt.push_str("{}");
772+
}
773+
suggest_fixed_fmt.push('"');
774+
775+
let suggest_fmt_count = if unused.len() == 1 {
776+
"consider adding format specifier".to_string()
777+
} else {
778+
format!("consider adding {} format specifiers", unused.len())
779+
};
780+
diag.span_suggestion_verbose(
781+
fmt_span,
782+
suggest_fmt_count,
783+
suggest_fixed_fmt,
784+
Applicability::MaybeIncorrect,
785+
);
763786
}
764787

765788
diag.emit();
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
fn no_format_specifier_two_unused_args() {
2+
println!("Hello", "World");
3+
//~^ ERROR argument never used
4+
//~| NOTE formatting specifier missing
5+
//~| NOTE format specifiers use curly braces: `{}`
6+
//~| NOTE argument never used
7+
}
8+
9+
fn no_format_specifier_multiple_unused_args() {
10+
println!("list: ", 1, 2, 3);
11+
//~^ ERROR multiple unused formatting arguments
12+
//~| NOTE multiple missing formatting specifiers
13+
//~| NOTE format specifiers use curly braces: `{}`
14+
//~| NOTE argument never used
15+
//~| NOTE argument never used
16+
//~| NOTE argument never used
17+
}
18+
19+
fn missing_format_specifiers_one_unused_arg() {
20+
println!("list: {}, {}", 1, 2, 3);
21+
//~^ ERROR argument never used
22+
//~| NOTE formatting specifier missing
23+
//~| NOTE argument never used
24+
}
25+
26+
fn missing_format_specifiers_multiple_unused_args() {
27+
println!("list: {}", 1, 2, 3);
28+
//~^ ERROR multiple unused formatting arguments
29+
//~| NOTE multiple missing formatting specifiers
30+
//~| NOTE argument never used
31+
//~| NOTE argument never used
32+
}
33+
34+
fn main() { }
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
error: argument never used
2+
--> $DIR/missing-format-specifiers-issue-68293.rs:2:23
3+
|
4+
LL | println!("Hello", "World");
5+
| ------- ^^^^^^^ argument never used
6+
| |
7+
| formatting specifier missing
8+
|
9+
= note: format specifiers use curly braces: `{}`
10+
help: consider adding format specifier
11+
|
12+
LL | println!("Hello{}", "World");
13+
| ++
14+
15+
error: multiple unused formatting arguments
16+
--> $DIR/missing-format-specifiers-issue-68293.rs:10:24
17+
|
18+
LL | println!("list: ", 1, 2, 3);
19+
| -------- ^ ^ ^ argument never used
20+
| | | |
21+
| | | argument never used
22+
| | argument never used
23+
| multiple missing formatting specifiers
24+
|
25+
= note: format specifiers use curly braces: `{}`
26+
help: consider adding 3 format specifiers
27+
|
28+
LL | println!("list: {}{}{}", 1, 2, 3);
29+
| ++++++
30+
31+
error: argument never used
32+
--> $DIR/missing-format-specifiers-issue-68293.rs:20:36
33+
|
34+
LL | println!("list: {}, {}", 1, 2, 3);
35+
| -------------- ^ argument never used
36+
| |
37+
| formatting specifier missing
38+
|
39+
help: consider adding format specifier
40+
|
41+
LL | println!("list: {}, {}{}", 1, 2, 3);
42+
| ++
43+
44+
error: multiple unused formatting arguments
45+
--> $DIR/missing-format-specifiers-issue-68293.rs:27:29
46+
|
47+
LL | println!("list: {}", 1, 2, 3);
48+
| ---------- ^ ^ argument never used
49+
| | |
50+
| | argument never used
51+
| multiple missing formatting specifiers
52+
|
53+
help: consider adding 2 format specifiers
54+
|
55+
LL | println!("list: {}{}{}", 1, 2, 3);
56+
| ++++
57+
58+
error: aborting due to 4 previous errors
59+

0 commit comments

Comments
 (0)