From: Gary Guo <gary@garyguo.net>
To: "Benno Lossin" <lossin@kernel.org>,
"Miguel Ojeda" <ojeda@kernel.org>,
"Boqun Feng" <boqun@kernel.org>,
"Björn Roy Baron" <bjorn3_gh@protonmail.com>,
"Andreas Hindborg" <a.hindborg@kernel.org>,
"Alice Ryhl" <aliceryhl@google.com>,
"Trevor Gross" <tmgross@umich.edu>,
"Danilo Krummrich" <dakr@kernel.org>
Cc: rust-for-linux@vger.kernel.org, linux-kernel@vger.kernel.org,
Gary Guo <gary@garyguo.net>,
Martin Kletzander <mkletzan@redhat.com>
Subject: [PATCH 1/8] rust: pin-init: internal: pin_data: filter non-`#[cfg]` attr in generated code
Date: Wed, 27 May 2026 18:19:52 +0100 [thread overview]
Message-ID: <20260527-pin-init-sync-v1-1-e20335ed2501@garyguo.net> (raw)
In-Reply-To: <20260527-pin-init-sync-v1-0-e20335ed2501@garyguo.net>
From: Martin Kletzander <mkletzan@redhat.com>
When using a macro with custom attributes in a `#[pin_data]` struct it
can mess up the generated code. The generated code needs nothing more than
the `#[cfg]` attribute, thus strip away all other attributes.
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
[ Rebased and updated to only include `#[cfg]` instead of both `#[cfg]` and
`#[doc]`; doc is not needed for the generated hidden items. - Gary ]
Co-developed-by: Gary Guo <gary@garyguo.net>
Signed-off-by: Gary Guo <gary@garyguo.net>
---
rust/pin-init/internal/src/pin_data.rs | 52 ++++++++++++++++++----------------
1 file changed, 28 insertions(+), 24 deletions(-)
diff --git a/rust/pin-init/internal/src/pin_data.rs b/rust/pin-init/internal/src/pin_data.rs
index 2284256a6220..9ca8235ed3d6 100644
--- a/rust/pin-init/internal/src/pin_data.rs
+++ b/rust/pin-init/internal/src/pin_data.rs
@@ -7,7 +7,7 @@
parse_quote, parse_quote_spanned,
spanned::Spanned,
visit_mut::VisitMut,
- Field, Generics, Ident, Item, PathSegment, Type, TypePath, Visibility, WhereClause,
+ Attribute, Field, Generics, Ident, Item, PathSegment, Type, TypePath, Visibility, WhereClause,
};
use crate::diagnostics::{DiagCtxt, ErrorGuaranteed};
@@ -38,6 +38,7 @@ fn parse(input: syn::parse::ParseStream<'_>) -> syn::Result<Self> {
struct FieldInfo<'a> {
field: &'a Field,
pinned: bool,
+ cfg_attrs: Vec<&'a Attribute>,
}
pub(crate) fn pin_data(
@@ -86,9 +87,16 @@ pub(crate) fn pin_data(
field.attrs.retain(|a| !a.path().is_ident("pin"));
let pinned = len != field.attrs.len();
+ let cfg_attrs = field
+ .attrs
+ .iter()
+ .filter(|a| a.path().is_ident("cfg"))
+ .collect();
+
FieldInfo {
field: &*field,
pinned,
+ cfg_attrs,
}
})
.collect();
@@ -171,7 +179,15 @@ fn generate_unpin_impl(
else {
unreachable!()
};
- let pinned_fields = fields.iter().filter(|f| f.pinned).map(|f| f.field);
+ let pinned_fields = fields.iter().filter(|f| f.pinned).map(|f| {
+ let ident = f.field.ident.as_ref().unwrap();
+ let ty = &f.field.ty;
+ let cfg_attrs = &f.cfg_attrs;
+ quote!(
+ #(#cfg_attrs)*
+ #ident: #ty
+ )
+ });
quote! {
// This struct will be used for the unpin analysis. It is needed, because only structurally
// pinned fields are relevant whether the struct should implement `Unpin`.
@@ -259,27 +275,20 @@ fn generate_projections(
let (fields_decl, fields_proj): (Vec<_>, Vec<_>) = fields
.iter()
.map(|field| {
- let Field {
- vis,
- ident,
- ty,
- attrs,
- ..
- } = &field.field;
-
- let mut no_doc_attrs = attrs.clone();
- no_doc_attrs.retain(|a| !a.path().is_ident("doc"));
+ let Field { vis, ident, ty, .. } = &field.field;
+ let cfg_attrs = &field.cfg_attrs;
+
let ident = ident
.as_ref()
.expect("only structs with named fields are supported");
if field.pinned {
(
quote!(
- #(#attrs)*
+ #(#cfg_attrs)*
#vis #ident: ::core::pin::Pin<&'__pin mut #ty>,
),
quote!(
- #(#no_doc_attrs)*
+ #(#cfg_attrs)*
// SAFETY: this field is structurally pinned.
#ident: unsafe { ::core::pin::Pin::new_unchecked(&mut #this.#ident) },
),
@@ -287,11 +296,11 @@ fn generate_projections(
} else {
(
quote!(
- #(#attrs)*
+ #(#cfg_attrs)*
#vis #ident: &'__pin mut #ty,
),
quote!(
- #(#no_doc_attrs)*
+ #(#cfg_attrs)*
#ident: &mut #this.#ident,
),
)
@@ -358,13 +367,8 @@ fn generate_the_pin_data(
let field_accessors = fields
.iter()
.map(|f| {
- let Field {
- vis,
- ident,
- ty,
- attrs,
- ..
- } = f.field;
+ let Field { vis, ident, ty, .. } = f.field;
+ let cfg_attrs = &f.cfg_attrs;
let field_name = ident
.as_ref()
@@ -381,7 +385,7 @@ fn generate_the_pin_data(
/// - `(*slot).#field_name` is properly aligned.
/// - `(*slot).#field_name` points to uninitialized and exclusively accessed
/// memory.
- #(#attrs)*
+ #(#cfg_attrs)*
#[inline(always)]
#vis unsafe fn #field_name(
self,
--
2.54.0
next prev parent reply other threads:[~2026-05-27 17:20 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-27 17:19 [PATCH 0/8] rust: pin-init upstream sync for v7.2 (round 2) Gary Guo
2026-05-27 17:19 ` Gary Guo [this message]
2026-05-27 17:19 ` [PATCH 2/8] rust: pin-init: internal: suppress `non_snake_case` lint in `#[pin_data]` Gary Guo
2026-05-27 17:19 ` [PATCH 3/8] rust: pin-init: internal: suppress `non_snake_case` lint in `[pin_]init!` Gary Guo
2026-05-27 17:19 ` [PATCH 4/8] rust: pin-init: docs: fix typos in MaybeZeroable documentation Gary Guo
2026-05-27 17:19 ` [PATCH 5/8] rust: pin-init: move `InitClosure` out from `__internal` Gary Guo
2026-05-27 17:19 ` [PATCH 6/8] rust: pin-init: remove `E` from `InitClosure` Gary Guo
2026-05-27 17:19 ` [PATCH 7/8] rust: pin-init: make `[pin_]init_array_from_fn` unwind safe Gary Guo
2026-05-27 17:19 ` [PATCH 8/8] rust: pin-init: make `[pin_]chain` " Gary Guo
2026-05-29 21:04 ` [PATCH 0/8] rust: pin-init upstream sync for v7.2 (round 2) Gary Guo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260527-pin-init-sync-v1-1-e20335ed2501@garyguo.net \
--to=gary@garyguo.net \
--cc=a.hindborg@kernel.org \
--cc=aliceryhl@google.com \
--cc=bjorn3_gh@protonmail.com \
--cc=boqun@kernel.org \
--cc=dakr@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=lossin@kernel.org \
--cc=mkletzan@redhat.com \
--cc=ojeda@kernel.org \
--cc=rust-for-linux@vger.kernel.org \
--cc=tmgross@umich.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®