about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_builtin_macros/src/format.rs27
-rw-r--r--tests/ui/suggestions/missing-format-specifiers-issue-68293.rs34
-rw-r--r--tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr59
3 files changed, 118 insertions, 2 deletions
diff --git a/compiler/rustc_builtin_macros/src/format.rs b/compiler/rustc_builtin_macros/src/format.rs
index 6415e55e0b0..ce9bda10721 100644
--- a/compiler/rustc_builtin_macros/src/format.rs
+++ b/compiler/rustc_builtin_macros/src/format.rs
@@ -758,8 +758,31 @@ fn report_missing_placeholders(
             check_foreign!(shell);
         }
     }
-    if !found_foreign && unused.len() == 1 {
-        diag.span_label(fmt_span, "formatting specifier missing");
+    if !found_foreign {
+        if unused.len() == 1 {
+            diag.span_label(fmt_span, "formatting specifier missing");
+        }
+        if used.iter().all(|used| !used) {
+            diag.note("format specifiers use curly braces: `{}`");
+        }
+
+        let mut suggest_fixed_fmt = format!("\"{}", &fmt_str[..fmt_str.len() - 1]);
+        for _ in &unused {
+            suggest_fixed_fmt.push_str("{}");
+        }
+        suggest_fixed_fmt.push('"');
+
+        let suggest_fmt_count = if unused.len() == 1 {
+            "consider adding format specifier".to_string()
+        } else {
+            format!("consider adding {} format specifiers", unused.len())
+        };
+        diag.span_suggestion_verbose(
+            fmt_span,
+            suggest_fmt_count,
+            suggest_fixed_fmt,
+            Applicability::MaybeIncorrect,
+        );
     }
 
     diag.emit();
diff --git a/tests/ui/suggestions/missing-format-specifiers-issue-68293.rs b/tests/ui/suggestions/missing-format-specifiers-issue-68293.rs
new file mode 100644
index 00000000000..e1f8710db5a
--- /dev/null
+++ b/tests/ui/suggestions/missing-format-specifiers-issue-68293.rs
@@ -0,0 +1,34 @@
+fn no_format_specifier_two_unused_args() {
+    println!("Hello", "World");
+    //~^ ERROR argument never used
+    //~| NOTE formatting specifier missing
+    //~| NOTE format specifiers use curly braces: `{}`
+    //~| NOTE argument never used
+}
+
+fn no_format_specifier_multiple_unused_args() {
+    println!("list: ", 1, 2, 3);
+    //~^ ERROR multiple unused formatting arguments
+    //~| NOTE multiple missing formatting specifiers
+    //~| NOTE format specifiers use curly braces: `{}`
+    //~| NOTE argument never used
+    //~| NOTE argument never used
+    //~| NOTE argument never used
+}
+
+fn missing_format_specifiers_one_unused_arg() {
+    println!("list: {}, {}", 1, 2, 3);
+    //~^ ERROR argument never used
+    //~| NOTE formatting specifier missing
+    //~| NOTE argument never used
+}
+
+fn missing_format_specifiers_multiple_unused_args() {
+    println!("list: {}", 1, 2, 3);
+    //~^ ERROR multiple unused formatting arguments
+    //~| NOTE multiple missing formatting specifiers
+    //~| NOTE argument never used
+    //~| NOTE argument never used
+}
+
+fn main() { }
diff --git a/tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr b/tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr
new file mode 100644
index 00000000000..654c8b0712a
--- /dev/null
+++ b/tests/ui/suggestions/missing-format-specifiers-issue-68293.stderr
@@ -0,0 +1,59 @@
+error: argument never used
+  --> $DIR/missing-format-specifiers-issue-68293.rs:2:23
+   |
+LL |     println!("Hello", "World");
+   |              -------  ^^^^^^^ argument never used
+   |              |
+   |              formatting specifier missing
+   |
+   = note: format specifiers use curly braces: `{}`
+help: consider adding format specifier
+   |
+LL |     println!("Hello{}", "World");
+   |                    ++
+
+error: multiple unused formatting arguments
+  --> $DIR/missing-format-specifiers-issue-68293.rs:10:24
+   |
+LL |     println!("list: ", 1, 2, 3);
+   |              --------  ^  ^  ^ argument never used
+   |              |         |  |
+   |              |         |  argument never used
+   |              |         argument never used
+   |              multiple missing formatting specifiers
+   |
+   = note: format specifiers use curly braces: `{}`
+help: consider adding 3 format specifiers
+   |
+LL |     println!("list: {}{}{}", 1, 2, 3);
+   |                     ++++++
+
+error: argument never used
+  --> $DIR/missing-format-specifiers-issue-68293.rs:20:36
+   |
+LL |     println!("list: {}, {}", 1, 2, 3);
+   |              --------------        ^ argument never used
+   |              |
+   |              formatting specifier missing
+   |
+help: consider adding format specifier
+   |
+LL |     println!("list: {}, {}{}", 1, 2, 3);
+   |                           ++
+
+error: multiple unused formatting arguments
+  --> $DIR/missing-format-specifiers-issue-68293.rs:27:29
+   |
+LL |     println!("list: {}", 1, 2, 3);
+   |              ----------     ^  ^ argument never used
+   |              |              |
+   |              |              argument never used
+   |              multiple missing formatting specifiers
+   |
+help: consider adding 2 format specifiers
+   |
+LL |     println!("list: {}{}{}", 1, 2, 3);
+   |                       ++++
+
+error: aborting due to 4 previous errors
+