From cc88d52766de983c9a8d69d1fcc24f6fb5f53e51 Mon Sep 17 00:00:00 2001 From: Luiz Georg Date: Wed, 11 Mar 2026 18:57:04 -0300 Subject: [PATCH 1/2] internal: error on duplicate `#[pin]` attribute adds the error and a compile_fail test to check for it. Closes: https://github.com/Rust-for-Linux/pin-init/issues/119 Signed-off-by: Luiz Georg --- internal/src/pin_data.rs | 8 ++++++-- tests/ui/compile-fail/pin_data/twice_pin.rs | 10 ++++++++++ tests/ui/compile-fail/pin_data/twice_pin.stderr | 5 +++++ 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 tests/ui/compile-fail/pin_data/twice_pin.rs create mode 100644 tests/ui/compile-fail/pin_data/twice_pin.stderr diff --git a/internal/src/pin_data.rs b/internal/src/pin_data.rs index 7d871236..0fd59bb0 100644 --- a/internal/src/pin_data.rs +++ b/internal/src/pin_data.rs @@ -79,9 +79,13 @@ pub(crate) fn pin_data( .map(|field| { let len = field.attrs.len(); field.attrs.retain(|a| !a.path().is_ident("pin")); - (len != field.attrs.len(), &*field) + let diff = len - field.attrs.len(); + if diff > 1 { + return Err(dcx.error(field, "#[pin] attribute set twice")); + } + Ok((diff > 0, &*field)) }) - .collect(); + .collect::>()?; for (pinned, field) in &fields { if !pinned && is_phantom_pinned(&field.ty) { diff --git a/tests/ui/compile-fail/pin_data/twice_pin.rs b/tests/ui/compile-fail/pin_data/twice_pin.rs new file mode 100644 index 00000000..c28dedd2 --- /dev/null +++ b/tests/ui/compile-fail/pin_data/twice_pin.rs @@ -0,0 +1,10 @@ +use pin_init::*; + +#[pin_data] +struct Foo { + #[pin] + #[pin] + a: usize, +} + +fn main() {} diff --git a/tests/ui/compile-fail/pin_data/twice_pin.stderr b/tests/ui/compile-fail/pin_data/twice_pin.stderr new file mode 100644 index 00000000..944b3a04 --- /dev/null +++ b/tests/ui/compile-fail/pin_data/twice_pin.stderr @@ -0,0 +1,5 @@ +error: #[pin] attribute set twice + --> tests/ui/compile-fail/pin_data/twice_pin.rs:7:5 + | +7 | a: usize, + | ^^^^^^^^ From 8d023c32e1ca87981cbf975d302498978dc5e2dd Mon Sep 17 00:00:00 2001 From: Luiz Georg Date: Thu, 12 Mar 2026 12:09:28 -0300 Subject: [PATCH 2/2] internal: update duplicate `#[pin]` error message Co-authored-by: Gary Guo Signed-off-by: Luiz Georg --- internal/src/pin_data.rs | 2 +- tests/ui/compile-fail/pin_data/twice_pin.stderr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/internal/src/pin_data.rs b/internal/src/pin_data.rs index 0fd59bb0..18018b5d 100644 --- a/internal/src/pin_data.rs +++ b/internal/src/pin_data.rs @@ -81,7 +81,7 @@ pub(crate) fn pin_data( field.attrs.retain(|a| !a.path().is_ident("pin")); let diff = len - field.attrs.len(); if diff > 1 { - return Err(dcx.error(field, "#[pin] attribute set twice")); + return Err(dcx.error(field, "#[pin] attribute specified more than once")); } Ok((diff > 0, &*field)) }) diff --git a/tests/ui/compile-fail/pin_data/twice_pin.stderr b/tests/ui/compile-fail/pin_data/twice_pin.stderr index 944b3a04..2a7ba524 100644 --- a/tests/ui/compile-fail/pin_data/twice_pin.stderr +++ b/tests/ui/compile-fail/pin_data/twice_pin.stderr @@ -1,4 +1,4 @@ -error: #[pin] attribute set twice +error: #[pin] attribute specified more than once --> tests/ui/compile-fail/pin_data/twice_pin.rs:7:5 | 7 | a: usize,