about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2022-07-14 20:45:23 -0700
committerMichael Goulet <michael@errs.io>2022-07-15 17:32:34 +0000
commitb71a09fda07efa16c4bdc0d4849f0b1b5e012dba (patch)
tree3de83c35104ea58ac9660ff770582012fedfce79
parent0fe5390a885eb47f506bf481cd9ea2b449705d79 (diff)
downloadrust-b71a09fda07efa16c4bdc0d4849f0b1b5e012dba.tar.gz
rust-b71a09fda07efa16c4bdc0d4849f0b1b5e012dba.zip
Fix ICE in named_arguments_used_positionally lint
-rw-r--r--compiler/rustc_builtin_macros/src/format.rs17
-rw-r--r--src/test/ui/macros/issue-99261.rs17
2 files changed, 25 insertions, 9 deletions
diff --git a/compiler/rustc_builtin_macros/src/format.rs b/compiler/rustc_builtin_macros/src/format.rs
index 4791151c7d3..d5eb8d4eeb9 100644
--- a/compiler/rustc_builtin_macros/src/format.rs
+++ b/compiler/rustc_builtin_macros/src/format.rs
@@ -16,7 +16,7 @@ use smallvec::SmallVec;
 
 use rustc_lint_defs::builtin::NAMED_ARGUMENTS_USED_POSITIONALLY;
 use rustc_lint_defs::{BufferedEarlyLint, BuiltinLintDiagnostics, LintId};
-use rustc_parse_format::{Count, FormatSpec};
+use rustc_parse_format::Count;
 use std::borrow::Cow;
 use std::collections::hash_map::Entry;
 
@@ -985,20 +985,19 @@ fn lint_named_arguments_used_positionally(
                 }
                 _ => {}
             };
-            match a.format {
-                FormatSpec { width: Count::CountIsName(s, _), .. }
-                | FormatSpec { precision: Count::CountIsName(s, _), .. } => {
-                    used_argument_names.insert(s);
-                }
-                _ => {}
-            };
+            if let Count::CountIsName(s, _) = a.format.width {
+                used_argument_names.insert(s);
+            }
+            if let Count::CountIsName(s, _) = a.format.precision {
+                used_argument_names.insert(s);
+            }
         }
     }
 
     for (symbol, (index, span)) in names {
         if !used_argument_names.contains(symbol.as_str()) {
             let msg = format!("named argument `{}` is not used by name", symbol.as_str());
-            let arg_span = cx.arg_spans[index];
+            let arg_span = cx.arg_spans.get(index).copied().unwrap_or(span);
             cx.ecx.buffered_early_lint.push(BufferedEarlyLint {
                 span: MultiSpan::from_span(span),
                 msg: msg.clone(),
diff --git a/src/test/ui/macros/issue-99261.rs b/src/test/ui/macros/issue-99261.rs
new file mode 100644
index 00000000000..40d26d08cba
--- /dev/null
+++ b/src/test/ui/macros/issue-99261.rs
@@ -0,0 +1,17 @@
+// check-pass
+
+#![deny(named_arguments_used_positionally)]
+
+fn main() {
+    let value: f64 = 314.15926;
+    let digits_before_decimal = 1;
+    let digits_after_decimal = 2;
+    let width = digits_before_decimal + 1 + digits_after_decimal;
+
+    println!(
+        "{value:0>width$.digits_after_decimal$}",
+        value = value,
+        width = width,
+        digits_after_decimal = digits_after_decimal,
+    );
+}