mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-05 13:25:20 +02:00

commit 211dcf77856db64c73e0c3b9ce0c624ec855daca 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)
|
|
}
|
|
}
|