diff options
| author | Michael Goulet <michael@errs.io> | 2022-07-14 20:45:23 -0700 |
|---|---|---|
| committer | Michael Goulet <michael@errs.io> | 2022-07-15 17:32:34 +0000 |
| commit | b71a09fda07efa16c4bdc0d4849f0b1b5e012dba (patch) | |
| tree | 3de83c35104ea58ac9660ff770582012fedfce79 | |
| parent | 0fe5390a885eb47f506bf481cd9ea2b449705d79 (diff) | |
| download | rust-b71a09fda07efa16c4bdc0d4849f0b1b5e012dba.tar.gz rust-b71a09fda07efa16c4bdc0d4849f0b1b5e012dba.zip | |
Fix ICE in named_arguments_used_positionally lint
| -rw-r--r-- | compiler/rustc_builtin_macros/src/format.rs | 17 | ||||
| -rw-r--r-- | src/test/ui/macros/issue-99261.rs | 17 |
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, + ); +} |
