mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00

commit 211dcf7785
upstream.
Starting with Rust 1.88.0 (expected 2025-06-26) [1], `rustc` may move
back the `uninlined_format_args` to `style` from `pedantic` (it was
there waiting for rust-analyzer suppotr), and thus we will start to see
lints like:
warning: variables can be used directly in the `format!` string
--> rust/macros/kunit.rs:105:37
|
105 | let kunit_wrapper_fn_name = format!("kunit_rust_wrapper_{}", test);
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#uninlined_format_args
help: change this to
|
105 - let kunit_wrapper_fn_name = format!("kunit_rust_wrapper_{}", test);
105 + let kunit_wrapper_fn_name = format!("kunit_rust_wrapper_{test}");
There is even a case that is a pure removal:
warning: variables can be used directly in the `format!` string
--> rust/macros/module.rs:51:13
|
51 | format!("{field}={content}\0", field = field, content = content)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#uninlined_format_args
help: change this to
|
51 - format!("{field}={content}\0", field = field, content = content)
51 + format!("{field}={content}\0")
The lints all seem like nice cleanups, thus just apply them.
We may want to disable `allow-mixed-uninlined-format-args` in the future.
Cc: stable@vger.kernel.org # Needed in 6.12.y and later (Rust is pinned in older LTSs).
Link: https://github.com/rust-lang/rust-clippy/pull/14160 [1]
Acked-by: Benno Lossin <lossin@kernel.org>
Reviewed-by: Tamir Duberstein <tamird@gmail.com>
Reviewed-by: Alice Ryhl <aliceryhl@google.com>
Link: https://lore.kernel.org/r/20250502140237.1659624-6-ojeda@kernel.org
Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
49 lines
1.7 KiB
Rust
49 lines
1.7 KiB
Rust
// SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
|
|
use proc_macro::{TokenStream, TokenTree};
|
|
|
|
pub(crate) fn pinned_drop(_args: TokenStream, input: TokenStream) -> TokenStream {
|
|
let mut toks = input.into_iter().collect::<Vec<_>>();
|
|
assert!(!toks.is_empty());
|
|
// Ensure that we have an `impl` item.
|
|
assert!(matches!(&toks[0], TokenTree::Ident(i) if i.to_string() == "impl"));
|
|
// Ensure that we are implementing `PinnedDrop`.
|
|
let mut nesting: usize = 0;
|
|
let mut pinned_drop_idx = None;
|
|
for (i, tt) in toks.iter().enumerate() {
|
|
match tt {
|
|
TokenTree::Punct(p) if p.as_char() == '<' => {
|
|
nesting += 1;
|
|
}
|
|
TokenTree::Punct(p) if p.as_char() == '>' => {
|
|
nesting = nesting.checked_sub(1).unwrap();
|
|
continue;
|
|
}
|
|
_ => {}
|
|
}
|
|
if i >= 1 && nesting == 0 {
|
|
// Found the end of the generics, this should be `PinnedDrop`.
|
|
assert!(
|
|
matches!(tt, TokenTree::Ident(i) if i.to_string() == "PinnedDrop"),
|
|
"expected 'PinnedDrop', found: '{tt:?}'"
|
|
);
|
|
pinned_drop_idx = Some(i);
|
|
break;
|
|
}
|
|
}
|
|
let idx = pinned_drop_idx
|
|
.unwrap_or_else(|| panic!("Expected an `impl` block implementing `PinnedDrop`."));
|
|
// Fully qualify the `PinnedDrop`, as to avoid any tampering.
|
|
toks.splice(idx..idx, quote!(::kernel::init::));
|
|
// Take the `{}` body and call the declarative macro.
|
|
if let Some(TokenTree::Group(last)) = toks.pop() {
|
|
let last = last.stream();
|
|
quote!(::kernel::__pinned_drop! {
|
|
@impl_sig(#(#toks)*),
|
|
@impl_body(#last),
|
|
})
|
|
} else {
|
|
TokenStream::from_iter(toks)
|
|
}
|
|
}
|