Add allow-mixed-uninlined-format-args config

Implement `allow-mixed-uninlined-format-args` config param to change the behavior of the `uninlined_format_args` lint. Now it is a part of `style`, and won't propose inlining in case of a mixed usage, e.g. `print!("{} {}", var, 1+2)`. If the user sets allow-mixed-uninlined-format-args config param to `false`, then it would behave like before, proposing to inline args even in the mixed case.
This commit is contained in:
Yuri Astrakhan 2022-11-27 10:12:51 -05:00
parent c55cadcfd9
commit 7a2d92e1f2
12 changed files with 1359 additions and 21 deletions

View file

@ -1,6 +1,6 @@
use clippy_utils::diagnostics::{span_lint_and_sugg, span_lint_and_then};
use clippy_utils::is_diag_trait_item;
use clippy_utils::macros::FormatParamKind::{Implicit, Named, Numbered, Starred};
use clippy_utils::macros::FormatParamKind::{Implicit, Named, NamedInline, Numbered, Starred};
use clippy_utils::macros::{
is_format_macro, is_panic, root_macro_call, Count, FormatArg, FormatArgsExpn, FormatParam, FormatParamUsage,
};
@ -106,19 +106,25 @@ declare_clippy_lint! {
/// format!("{var:.prec$}");
/// ```
///
/// ### Known Problems
///
/// There may be a false positive if the format string is expanded from certain proc macros:
///
/// ```ignore
/// println!(indoc!("{}"), var);
/// If allow-mixed-uninlined-format-args is set to false in clippy.toml,
/// the following code will also trigger the lint:
/// ```rust
/// # let var = 42;
/// format!("{} {}", var, 1+2);
/// ```
/// Use instead:
/// ```rust
/// # let var = 42;
/// format!("{var} {}", 1+2);
/// ```
///
/// ### Known Problems
///
/// If a format string contains a numbered argument that cannot be inlined
/// nothing will be suggested, e.g. `println!("{0}={1}", var, 1+2)`.
#[clippy::version = "1.65.0"]
pub UNINLINED_FORMAT_ARGS,
pedantic,
style,
"using non-inlined variables in `format!` calls"
}
@ -162,12 +168,16 @@ impl_lint_pass!(FormatArgs => [
pub struct FormatArgs {
msrv: Msrv,
ignore_mixed: bool,
}
impl FormatArgs {
#[must_use]
pub fn new(msrv: Msrv) -> Self {
Self { msrv }
pub fn new(msrv: Msrv, allow_mixed_uninlined_format_args: bool) -> Self {
Self {
msrv,
ignore_mixed: allow_mixed_uninlined_format_args,
}
}
}
@ -192,7 +202,7 @@ impl<'tcx> LateLintPass<'tcx> for FormatArgs {
check_to_string_in_format_args(cx, name, arg.param.value);
}
if self.msrv.meets(msrvs::FORMAT_ARGS_CAPTURE) {
check_uninlined_args(cx, &format_args, outermost_expn_data.call_site, macro_def_id);
check_uninlined_args(cx, &format_args, outermost_expn_data.call_site, macro_def_id, self.ignore_mixed);
}
}
}
@ -270,7 +280,13 @@ fn check_unused_format_specifier(cx: &LateContext<'_>, arg: &FormatArg<'_>) {
}
}
fn check_uninlined_args(cx: &LateContext<'_>, args: &FormatArgsExpn<'_>, call_site: Span, def_id: DefId) {
fn check_uninlined_args(
cx: &LateContext<'_>,
args: &FormatArgsExpn<'_>,
call_site: Span,
def_id: DefId,
ignore_mixed: bool,
) {
if args.format_string.span.from_expansion() {
return;
}
@ -285,7 +301,7 @@ fn check_uninlined_args(cx: &LateContext<'_>, args: &FormatArgsExpn<'_>, call_si
// we cannot remove any other arguments in the format string,
// because the index numbers might be wrong after inlining.
// Example of an un-inlinable format: print!("{}{1}", foo, 2)
if !args.params().all(|p| check_one_arg(args, &p, &mut fixes)) || fixes.is_empty() {
if !args.params().all(|p| check_one_arg(args, &p, &mut fixes, ignore_mixed)) || fixes.is_empty() {
return;
}
@ -305,11 +321,23 @@ fn check_uninlined_args(cx: &LateContext<'_>, args: &FormatArgsExpn<'_>, call_si
Applicability::MachineApplicable,
if multiline_fix { CompletelyHidden } else { ShowCode },
);
if ignore_mixed {
// Improve lint config discoverability
diag.note_once(
"this lint can also fix mixed format arg inlining if \
`allow-mixed-uninlined-format-args = false` is set in the `clippy.toml` file",
);
}
},
);
}
fn check_one_arg(args: &FormatArgsExpn<'_>, param: &FormatParam<'_>, fixes: &mut Vec<(Span, String)>) -> bool {
fn check_one_arg(
args: &FormatArgsExpn<'_>,
param: &FormatParam<'_>,
fixes: &mut Vec<(Span, String)>,
ignore_mixed: bool,
) -> bool {
if matches!(param.kind, Implicit | Starred | Named(_) | Numbered)
&& let ExprKind::Path(QPath::Resolved(None, path)) = param.value.kind
&& let [segment] = path.segments
@ -324,8 +352,10 @@ fn check_one_arg(args: &FormatArgsExpn<'_>, param: &FormatParam<'_>, fixes: &mut
fixes.push((arg_span, String::new()));
true // successful inlining, continue checking
} else {
// if we can't inline a numbered argument, we can't continue
param.kind != Numbered
// Do not continue inlining (return false) in case
// * if we can't inline a numbered argument, e.g. `print!("{0} ...", foo.bar, ...)`
// * if allow_mixed_uninlined_format_args is false and this arg hasn't been inlined already
param.kind != Numbered && (!ignore_mixed || matches!(param.kind, NamedInline(_)))
}
}

View file

@ -828,7 +828,8 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
))
});
store.register_late_pass(move |_| Box::new(undocumented_unsafe_blocks::UndocumentedUnsafeBlocks));
store.register_late_pass(move |_| Box::new(format_args::FormatArgs::new(msrv())));
let allow_mixed_uninlined = conf.allow_mixed_uninlined_format_args;
store.register_late_pass(move |_| Box::new(format_args::FormatArgs::new(msrv(), allow_mixed_uninlined)));
store.register_late_pass(|_| Box::new(trailing_empty_array::TrailingEmptyArray));
store.register_early_pass(|| Box::new(octal_escapes::OctalEscapes));
store.register_late_pass(|_| Box::new(needless_late_init::NeedlessLateInit));

View file

@ -402,6 +402,10 @@ define_Conf! {
/// A list of paths to types that should be treated like `Arc`, i.e. ignored but
/// for the generic parameters for determining interior mutability
(ignore_interior_mutability: Vec<String> = Vec::from(["bytes::Bytes".into()])),
/// Lint: UNINLINED_FORMAT_ARGS.
///
/// Whether to allow mixed uninlined format args, e.g. `format!("{} {}", a, foo.bar)`
(allow_mixed_uninlined_format_args: bool = true),
}
/// Search for the configuration file.

View file

@ -0,0 +1,32 @@
// compile-flags: --emit=link
// no-prefer-dynamic
#![crate_type = "proc-macro"]
extern crate proc_macro;
use proc_macro::{token_stream::IntoIter, Group, Span, TokenStream, TokenTree};
#[proc_macro]
pub fn with_span(input: TokenStream) -> TokenStream {
let mut iter = input.into_iter();
let span = iter.next().unwrap().span();
let mut res = TokenStream::new();
write_with_span(span, iter, &mut res);
res
}
fn write_with_span(s: Span, input: IntoIter, out: &mut TokenStream) {
for mut tt in input {
if let TokenTree::Group(g) = tt {
let mut stream = TokenStream::new();
write_with_span(s, g.stream().into_iter(), &mut stream);
let mut group = Group::new(g.delimiter(), stream);
group.set_span(s);
out.extend([TokenTree::Group(group)]);
} else {
tt.set_span(s);
out.extend([tt]);
}
}
}

View file

@ -0,0 +1 @@
allow-mixed-uninlined-format-args = false

View file

@ -0,0 +1,177 @@
// aux-build:proc_macro_with_span.rs
// run-rustfix
#![feature(custom_inner_attributes)]
#![warn(clippy::uninlined_format_args)]
#![allow(named_arguments_used_positionally, unused_imports, unused_macros, unused_variables)]
#![allow(clippy::eq_op, clippy::format_in_format_args, clippy::print_literal)]
extern crate proc_macro_with_span;
use proc_macro_with_span::with_span;
macro_rules! no_param_str {
() => {
"{}"
};
}
macro_rules! my_println {
($($args:tt),*) => {{
println!($($args),*)
}};
}
macro_rules! my_println_args {
($($args:tt),*) => {{
println!("foo: {}", format_args!($($args),*))
}};
}
fn tester(fn_arg: i32) {
let local_i32 = 1;
let local_f64 = 2.0;
let local_opt: Option<i32> = Some(3);
let width = 4;
let prec = 5;
let val = 6;
// make sure this file hasn't been corrupted with tabs converted to spaces
// let _ = ' '; // <- this is a single tab character
let _: &[u8; 3] = b" "; // <- <tab><space><tab>
println!("val='{local_i32}'");
println!("val='{local_i32}'"); // 3 spaces
println!("val='{local_i32}'"); // tab
println!("val='{local_i32}'"); // space+tab
println!("val='{local_i32}'"); // tab+space
println!(
"val='{local_i32}'"
);
println!("{local_i32}");
println!("{fn_arg}");
println!("{local_i32:?}");
println!("{local_i32:#?}");
println!("{local_i32:4}");
println!("{local_i32:04}");
println!("{local_i32:<3}");
println!("{local_i32:#010x}");
println!("{local_f64:.1}");
println!("Hello {} is {local_f64:.local_i32$}", "x");
println!("Hello {local_i32} is {local_f64:.*}", 5);
println!("Hello {local_i32} is {local_f64:.*}", 5);
println!("{local_i32} {local_f64}");
println!("{local_i32}, {}", local_opt.unwrap());
println!("{val}");
println!("{val}");
println!("{} {1}", local_i32, 42);
println!("val='{local_i32}'");
println!("val='{local_i32}'");
println!("val='{local_i32}'");
println!("val='{fn_arg}'");
println!("{local_i32}");
println!("{local_i32:?}");
println!("{local_i32:#?}");
println!("{local_i32:04}");
println!("{local_i32:<3}");
println!("{local_i32:#010x}");
println!("{local_f64:.1}");
println!("{local_i32} {local_i32}");
println!("{local_f64} {local_i32} {local_i32} {local_f64}");
println!("{local_i32} {local_f64}");
println!("{local_f64} {local_i32}");
println!("{local_f64} {local_i32} {local_f64} {local_i32}");
println!("{1} {0}", "str", local_i32);
println!("{local_i32}");
println!("{local_i32:width$}");
println!("{local_i32:width$}");
println!("{local_i32:.prec$}");
println!("{local_i32:.prec$}");
println!("{val:val$}");
println!("{val:val$}");
println!("{val:val$.val$}");
println!("{val:val$.val$}");
println!("{val:val$.val$}");
println!("{val:val$.val$}");
println!("{val:val$.val$}");
println!("{val:val$.val$}");
println!("{val:val$.val$}");
println!("{val:val$.val$}");
println!("{width:width$}");
println!("{local_i32:width$}");
println!("{width:width$}");
println!("{local_i32:width$}");
println!("{prec:.prec$}");
println!("{local_i32:.prec$}");
println!("{prec:.prec$}");
println!("{local_i32:.prec$}");
println!("{width:width$.prec$}");
println!("{width:width$.prec$}");
println!("{local_f64:width$.prec$}");
println!("{local_f64:width$.prec$} {local_f64} {width} {prec}");
println!(
"{local_i32:width$.prec$} {local_i32:prec$.width$} {width:local_i32$.prec$} {width:prec$.local_i32$} {prec:local_i32$.width$} {prec:width$.local_i32$}",
);
println!(
"{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$} {3}",
local_i32,
width,
prec,
1 + 2
);
println!("Width = {local_i32}, value with width = {local_f64:local_i32$}");
println!("{local_i32:width$.prec$}");
println!("{width:width$.prec$}");
println!("{}", format!("{local_i32}"));
my_println!("{}", local_i32);
my_println_args!("{}", local_i32);
// these should NOT be modified by the lint
println!(concat!("nope ", "{}"), local_i32);
println!("val='{local_i32}'");
println!("val='{local_i32 }'");
println!("val='{local_i32 }'"); // with tab
println!("val='{local_i32\n}'");
println!("{}", usize::MAX);
println!("{}", local_opt.unwrap());
println!(
"val='{local_i32
}'"
);
println!(no_param_str!(), local_i32);
println!(
"{val}",
);
println!("{val}");
println!(with_span!("{0} {1}" "{1} {0}"), local_i32, local_f64);
println!("{}", with_span!(span val));
if local_i32 > 0 {
panic!("p1 {local_i32}");
}
if local_i32 > 0 {
panic!("p2 {local_i32}");
}
if local_i32 > 0 {
panic!("p3 {local_i32}");
}
if local_i32 > 0 {
panic!("p4 {local_i32}");
}
}
fn main() {
tester(42);
}
fn _under_msrv() {
#![clippy::msrv = "1.57"]
let local_i32 = 1;
println!("don't expand='{}'", local_i32);
}
fn _meets_msrv() {
#![clippy::msrv = "1.58"]
let local_i32 = 1;
println!("expand='{local_i32}'");
}

View file

@ -0,0 +1,182 @@
// aux-build:proc_macro_with_span.rs
// run-rustfix
#![feature(custom_inner_attributes)]
#![warn(clippy::uninlined_format_args)]
#![allow(named_arguments_used_positionally, unused_imports, unused_macros, unused_variables)]
#![allow(clippy::eq_op, clippy::format_in_format_args, clippy::print_literal)]
extern crate proc_macro_with_span;
use proc_macro_with_span::with_span;
macro_rules! no_param_str {
() => {
"{}"
};
}
macro_rules! my_println {
($($args:tt),*) => {{
println!($($args),*)
}};
}
macro_rules! my_println_args {
($($args:tt),*) => {{
println!("foo: {}", format_args!($($args),*))
}};
}
fn tester(fn_arg: i32) {
let local_i32 = 1;
let local_f64 = 2.0;
let local_opt: Option<i32> = Some(3);
let width = 4;
let prec = 5;
let val = 6;
// make sure this file hasn't been corrupted with tabs converted to spaces
// let _ = ' '; // <- this is a single tab character
let _: &[u8; 3] = b" "; // <- <tab><space><tab>
println!("val='{}'", local_i32);
println!("val='{ }'", local_i32); // 3 spaces
println!("val='{ }'", local_i32); // tab
println!("val='{ }'", local_i32); // space+tab
println!("val='{ }'", local_i32); // tab+space
println!(
"val='{
}'",
local_i32
);
println!("{}", local_i32);
println!("{}", fn_arg);
println!("{:?}", local_i32);
println!("{:#?}", local_i32);
println!("{:4}", local_i32);
println!("{:04}", local_i32);
println!("{:<3}", local_i32);
println!("{:#010x}", local_i32);
println!("{:.1}", local_f64);
println!("Hello {} is {:.*}", "x", local_i32, local_f64);
println!("Hello {} is {:.*}", local_i32, 5, local_f64);
println!("Hello {} is {2:.*}", local_i32, 5, local_f64);
println!("{} {}", local_i32, local_f64);
println!("{}, {}", local_i32, local_opt.unwrap());
println!("{}", val);
println!("{}", v = val);
println!("{} {1}", local_i32, 42);
println!("val='{\t }'", local_i32);
println!("val='{\n }'", local_i32);
println!("val='{local_i32}'", local_i32 = local_i32);
println!("val='{local_i32}'", local_i32 = fn_arg);
println!("{0}", local_i32);
println!("{0:?}", local_i32);
println!("{0:#?}", local_i32);
println!("{0:04}", local_i32);
println!("{0:<3}", local_i32);
println!("{0:#010x}", local_i32);
println!("{0:.1}", local_f64);
println!("{0} {0}", local_i32);
println!("{1} {} {0} {}", local_i32, local_f64);
println!("{0} {1}", local_i32, local_f64);
println!("{1} {0}", local_i32, local_f64);
println!("{1} {0} {1} {0}", local_i32, local_f64);
println!("{1} {0}", "str", local_i32);
println!("{v}", v = local_i32);
println!("{local_i32:0$}", width);
println!("{local_i32:w$}", w = width);
println!("{local_i32:.0$}", prec);
println!("{local_i32:.p$}", p = prec);
println!("{:0$}", v = val);
println!("{0:0$}", v = val);
println!("{:0$.0$}", v = val);
println!("{0:0$.0$}", v = val);
println!("{0:0$.v$}", v = val);
println!("{0:v$.0$}", v = val);
println!("{v:0$.0$}", v = val);
println!("{v:v$.0$}", v = val);
println!("{v:0$.v$}", v = val);
println!("{v:v$.v$}", v = val);
println!("{:0$}", width);
println!("{:1$}", local_i32, width);
println!("{:w$}", w = width);
println!("{:w$}", local_i32, w = width);
println!("{:.0$}", prec);
println!("{:.1$}", local_i32, prec);
println!("{:.p$}", p = prec);
println!("{:.p$}", local_i32, p = prec);
println!("{:0$.1$}", width, prec);
println!("{:0$.w$}", width, w = prec);
println!("{:1$.2$}", local_f64, width, prec);
println!("{:1$.2$} {0} {1} {2}", local_f64, width, prec);
println!(
"{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$}",
local_i32, width, prec,
);
println!(
"{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$} {3}",
local_i32,
width,
prec,
1 + 2
);
println!("Width = {}, value with width = {:0$}", local_i32, local_f64);
println!("{:w$.p$}", local_i32, w = width, p = prec);
println!("{:w$.p$}", w = width, p = prec);
println!("{}", format!("{}", local_i32));
my_println!("{}", local_i32);
my_println_args!("{}", local_i32);
// these should NOT be modified by the lint
println!(concat!("nope ", "{}"), local_i32);
println!("val='{local_i32}'");
println!("val='{local_i32 }'");
println!("val='{local_i32 }'"); // with tab
println!("val='{local_i32\n}'");
println!("{}", usize::MAX);
println!("{}", local_opt.unwrap());
println!(
"val='{local_i32
}'"
);
println!(no_param_str!(), local_i32);
println!(
"{}",
// comment with a comma , in it
val,
);
println!("{}", /* comment with a comma , in it */ val);
println!(with_span!("{0} {1}" "{1} {0}"), local_i32, local_f64);
println!("{}", with_span!(span val));
if local_i32 > 0 {
panic!("p1 {}", local_i32);
}
if local_i32 > 0 {
panic!("p2 {0}", local_i32);
}
if local_i32 > 0 {
panic!("p3 {local_i32}", local_i32 = local_i32);
}
if local_i32 > 0 {
panic!("p4 {local_i32}");
}
}
fn main() {
tester(42);
}
fn _under_msrv() {
#![clippy::msrv = "1.57"]
let local_i32 = 1;
println!("don't expand='{}'", local_i32);
}
fn _meets_msrv() {
#![clippy::msrv = "1.58"]
let local_i32 = 1;
println!("expand='{}'", local_i32);
}

View file

@ -0,0 +1,908 @@
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:41:5
|
LL | println!("val='{}'", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: `-D clippy::uninlined-format-args` implied by `-D warnings`
help: change this to
|
LL - println!("val='{}'", local_i32);
LL + println!("val='{local_i32}'");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:42:5
|
LL | println!("val='{ }'", local_i32); // 3 spaces
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{ }'", local_i32); // 3 spaces
LL + println!("val='{local_i32}'"); // 3 spaces
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:43:5
|
LL | println!("val='{ }'", local_i32); // tab
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{ }'", local_i32); // tab
LL + println!("val='{local_i32}'"); // tab
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:44:5
|
LL | println!("val='{ }'", local_i32); // space+tab
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{ }'", local_i32); // space+tab
LL + println!("val='{local_i32}'"); // space+tab
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:45:5
|
LL | println!("val='{ }'", local_i32); // tab+space
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{ }'", local_i32); // tab+space
LL + println!("val='{local_i32}'"); // tab+space
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:46:5
|
LL | / println!(
LL | | "val='{
LL | | }'",
LL | | local_i32
LL | | );
| |_____^
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:51:5
|
LL | println!("{}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{}", local_i32);
LL + println!("{local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:52:5
|
LL | println!("{}", fn_arg);
| ^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{}", fn_arg);
LL + println!("{fn_arg}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:53:5
|
LL | println!("{:?}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:?}", local_i32);
LL + println!("{local_i32:?}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:54:5
|
LL | println!("{:#?}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:#?}", local_i32);
LL + println!("{local_i32:#?}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:55:5
|
LL | println!("{:4}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:4}", local_i32);
LL + println!("{local_i32:4}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:56:5
|
LL | println!("{:04}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:04}", local_i32);
LL + println!("{local_i32:04}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:57:5
|
LL | println!("{:<3}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:<3}", local_i32);
LL + println!("{local_i32:<3}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:58:5
|
LL | println!("{:#010x}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:#010x}", local_i32);
LL + println!("{local_i32:#010x}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:59:5
|
LL | println!("{:.1}", local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:.1}", local_f64);
LL + println!("{local_f64:.1}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:60:5
|
LL | println!("Hello {} is {:.*}", "x", local_i32, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("Hello {} is {:.*}", "x", local_i32, local_f64);
LL + println!("Hello {} is {local_f64:.local_i32$}", "x");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:61:5
|
LL | println!("Hello {} is {:.*}", local_i32, 5, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("Hello {} is {:.*}", local_i32, 5, local_f64);
LL + println!("Hello {local_i32} is {local_f64:.*}", 5);
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:62:5
|
LL | println!("Hello {} is {2:.*}", local_i32, 5, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("Hello {} is {2:.*}", local_i32, 5, local_f64);
LL + println!("Hello {local_i32} is {local_f64:.*}", 5);
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:63:5
|
LL | println!("{} {}", local_i32, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{} {}", local_i32, local_f64);
LL + println!("{local_i32} {local_f64}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:64:5
|
LL | println!("{}, {}", local_i32, local_opt.unwrap());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{}, {}", local_i32, local_opt.unwrap());
LL + println!("{local_i32}, {}", local_opt.unwrap());
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:65:5
|
LL | println!("{}", val);
| ^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{}", val);
LL + println!("{val}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:66:5
|
LL | println!("{}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{}", v = val);
LL + println!("{val}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:68:5
|
LL | println!("val='{/t }'", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{/t }'", local_i32);
LL + println!("val='{local_i32}'");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:69:5
|
LL | println!("val='{/n }'", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{/n }'", local_i32);
LL + println!("val='{local_i32}'");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:70:5
|
LL | println!("val='{local_i32}'", local_i32 = local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{local_i32}'", local_i32 = local_i32);
LL + println!("val='{local_i32}'");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:71:5
|
LL | println!("val='{local_i32}'", local_i32 = fn_arg);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("val='{local_i32}'", local_i32 = fn_arg);
LL + println!("val='{fn_arg}'");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:72:5
|
LL | println!("{0}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0}", local_i32);
LL + println!("{local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:73:5
|
LL | println!("{0:?}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:?}", local_i32);
LL + println!("{local_i32:?}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:74:5
|
LL | println!("{0:#?}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:#?}", local_i32);
LL + println!("{local_i32:#?}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:75:5
|
LL | println!("{0:04}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:04}", local_i32);
LL + println!("{local_i32:04}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:76:5
|
LL | println!("{0:<3}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:<3}", local_i32);
LL + println!("{local_i32:<3}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:77:5
|
LL | println!("{0:#010x}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:#010x}", local_i32);
LL + println!("{local_i32:#010x}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:78:5
|
LL | println!("{0:.1}", local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:.1}", local_f64);
LL + println!("{local_f64:.1}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:79:5
|
LL | println!("{0} {0}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0} {0}", local_i32);
LL + println!("{local_i32} {local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:80:5
|
LL | println!("{1} {} {0} {}", local_i32, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{1} {} {0} {}", local_i32, local_f64);
LL + println!("{local_f64} {local_i32} {local_i32} {local_f64}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:81:5
|
LL | println!("{0} {1}", local_i32, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0} {1}", local_i32, local_f64);
LL + println!("{local_i32} {local_f64}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:82:5
|
LL | println!("{1} {0}", local_i32, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{1} {0}", local_i32, local_f64);
LL + println!("{local_f64} {local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:83:5
|
LL | println!("{1} {0} {1} {0}", local_i32, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{1} {0} {1} {0}", local_i32, local_f64);
LL + println!("{local_f64} {local_i32} {local_f64} {local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:85:5
|
LL | println!("{v}", v = local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{v}", v = local_i32);
LL + println!("{local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:86:5
|
LL | println!("{local_i32:0$}", width);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{local_i32:0$}", width);
LL + println!("{local_i32:width$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:87:5
|
LL | println!("{local_i32:w$}", w = width);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{local_i32:w$}", w = width);
LL + println!("{local_i32:width$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:88:5
|
LL | println!("{local_i32:.0$}", prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{local_i32:.0$}", prec);
LL + println!("{local_i32:.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:89:5
|
LL | println!("{local_i32:.p$}", p = prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{local_i32:.p$}", p = prec);
LL + println!("{local_i32:.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:90:5
|
LL | println!("{:0$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:0$}", v = val);
LL + println!("{val:val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:91:5
|
LL | println!("{0:0$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:0$}", v = val);
LL + println!("{val:val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:92:5
|
LL | println!("{:0$.0$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:0$.0$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:93:5
|
LL | println!("{0:0$.0$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:0$.0$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:94:5
|
LL | println!("{0:0$.v$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:0$.v$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:95:5
|
LL | println!("{0:v$.0$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{0:v$.0$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:96:5
|
LL | println!("{v:0$.0$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{v:0$.0$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:97:5
|
LL | println!("{v:v$.0$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{v:v$.0$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:98:5
|
LL | println!("{v:0$.v$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{v:0$.v$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:99:5
|
LL | println!("{v:v$.v$}", v = val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{v:v$.v$}", v = val);
LL + println!("{val:val$.val$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:100:5
|
LL | println!("{:0$}", width);
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:0$}", width);
LL + println!("{width:width$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:101:5
|
LL | println!("{:1$}", local_i32, width);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:1$}", local_i32, width);
LL + println!("{local_i32:width$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:102:5
|
LL | println!("{:w$}", w = width);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:w$}", w = width);
LL + println!("{width:width$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:103:5
|
LL | println!("{:w$}", local_i32, w = width);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:w$}", local_i32, w = width);
LL + println!("{local_i32:width$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:104:5
|
LL | println!("{:.0$}", prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:.0$}", prec);
LL + println!("{prec:.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:105:5
|
LL | println!("{:.1$}", local_i32, prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:.1$}", local_i32, prec);
LL + println!("{local_i32:.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:106:5
|
LL | println!("{:.p$}", p = prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:.p$}", p = prec);
LL + println!("{prec:.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:107:5
|
LL | println!("{:.p$}", local_i32, p = prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:.p$}", local_i32, p = prec);
LL + println!("{local_i32:.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:108:5
|
LL | println!("{:0$.1$}", width, prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:0$.1$}", width, prec);
LL + println!("{width:width$.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:109:5
|
LL | println!("{:0$.w$}", width, w = prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:0$.w$}", width, w = prec);
LL + println!("{width:width$.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:110:5
|
LL | println!("{:1$.2$}", local_f64, width, prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:1$.2$}", local_f64, width, prec);
LL + println!("{local_f64:width$.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:111:5
|
LL | println!("{:1$.2$} {0} {1} {2}", local_f64, width, prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:1$.2$} {0} {1} {2}", local_f64, width, prec);
LL + println!("{local_f64:width$.prec$} {local_f64} {width} {prec}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:112:5
|
LL | / println!(
LL | | "{0:1$.2$} {0:2$.1$} {1:0$.2$} {1:2$.0$} {2:0$.1$} {2:1$.0$}",
LL | | local_i32, width, prec,
LL | | );
| |_____^
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:123:5
|
LL | println!("Width = {}, value with width = {:0$}", local_i32, local_f64);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("Width = {}, value with width = {:0$}", local_i32, local_f64);
LL + println!("Width = {local_i32}, value with width = {local_f64:local_i32$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:124:5
|
LL | println!("{:w$.p$}", local_i32, w = width, p = prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:w$.p$}", local_i32, w = width, p = prec);
LL + println!("{local_i32:width$.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:125:5
|
LL | println!("{:w$.p$}", w = width, p = prec);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{:w$.p$}", w = width, p = prec);
LL + println!("{width:width$.prec$}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:126:20
|
LL | println!("{}", format!("{}", local_i32));
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{}", format!("{}", local_i32));
LL + println!("{}", format!("{local_i32}"));
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:144:5
|
LL | / println!(
LL | | "{}",
LL | | // comment with a comma , in it
LL | | val,
LL | | );
| |_____^
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:149:5
|
LL | println!("{}", /* comment with a comma , in it */ val);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("{}", /* comment with a comma , in it */ val);
LL + println!("{val}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:155:9
|
LL | panic!("p1 {}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - panic!("p1 {}", local_i32);
LL + panic!("p1 {local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:158:9
|
LL | panic!("p2 {0}", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - panic!("p2 {0}", local_i32);
LL + panic!("p2 {local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:161:9
|
LL | panic!("p3 {local_i32}", local_i32 = local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - panic!("p3 {local_i32}", local_i32 = local_i32);
LL + panic!("p3 {local_i32}");
|
error: variables can be used directly in the `format!` string
--> $DIR/uninlined_format_args.rs:181:5
|
LL | println!("expand='{}'", local_i32);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: change this to
|
LL - println!("expand='{}'", local_i32);
LL + println!("expand='{local_i32}'");
|
error: aborting due to 76 previous errors

View file

@ -1,6 +1,7 @@
error: error reading Clippy's configuration file `$DIR/clippy.toml`: unknown field `foobar`, expected one of
allow-dbg-in-tests
allow-expect-in-tests
allow-mixed-uninlined-format-args
allow-print-in-tests
allow-unwrap-in-tests
allowed-scripts

View file

@ -54,11 +54,11 @@ fn tester(fn_arg: i32) {
println!("{local_i32:<3}");
println!("{local_i32:#010x}");
println!("{local_f64:.1}");
println!("Hello {} is {local_f64:.local_i32$}", "x");
println!("Hello {local_i32} is {local_f64:.*}", 5);
println!("Hello {local_i32} is {local_f64:.*}", 5);
println!("Hello {} is {:.*}", "x", local_i32, local_f64);
println!("Hello {} is {:.*}", local_i32, 5, local_f64);
println!("Hello {} is {2:.*}", local_i32, 5, local_f64);
println!("{local_i32} {local_f64}");
println!("{local_i32}, {}", local_opt.unwrap());
println!("{}, {}", local_i32, local_opt.unwrap());
println!("{val}");
println!("{val}");
println!("{} {1}", local_i32, 42);

View file

@ -4,6 +4,7 @@ error: variables can be used directly in the `format!` string
LL | println!("val='{}'", var);
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this lint can also fix mixed format arg inlining if `allow-mixed-uninlined-format-args = false` is set in the `clippy.toml` file
= note: `-D clippy::uninlined-format-args` implied by `-D warnings`
help: change this to
|

View file

@ -4,6 +4,7 @@ error: variables can be used directly in the `format!` string
LL | println!("val='{}'", var);
| ^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: this lint can also fix mixed format arg inlining if `allow-mixed-uninlined-format-args = false` is set in the `clippy.toml` file
= note: `-D clippy::uninlined-format-args` implied by `-D warnings`
help: change this to
|