Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Corrected `T: Sized` bounds to `T: ?Sized` in the generated `PinnedDrop`
check by `#[pin_data]`.
- `init!` and `pin_init!` no longer produce `nonstandard_style` group warnings at the
call site when used for structs with non-snake-case field names. Warnings on the
struct definition are unaffected.
Comment on lines +41 to +43
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- `init!` and `pin_init!` no longer produce `nonstandard_style` group warnings at the
call site when used for structs with non-snake-case field names. Warnings on the
struct definition are unaffected.
- `init!` and `pin_init!` no longer produce `non_snake_case` warnings if field names are
not of snake case. Warnings on the struct definitions are unaffected.

actually, could you update code to use the specific lint, such as non_snake_case for suppression?

Also, could you squash the changelog update into the same commit that update the code please.

You'd also probably want a line about #[pin_data], to mention that lints can now be properly suppressed where it couldn't previously.


## [0.0.10] - 2025-08-19

Expand Down
15 changes: 12 additions & 3 deletions internal/src/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,12 @@ fn init_fields(
// Setting the span of `value_ident` to `value`'s span improves error messages
// when the type of `value` is wrong.
value_ident.set_span(value.span());
quote!(let #value_ident = #value;)
quote! {
// Allow `nonstandard_style` since the same warning is going to be reported for
// the struct field.
#[allow(nonstandard_style)]
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, actually this can cause lints to be suppressed on #value, which is provided by the user.

Code like

init!(foo: {
    let Foo = 1;
    1
})

will be incorrectly suppressed?

let #value_ident = #value;
}
});
// Again span for better diagnostics
let write = quote_spanned!(ident.span()=> ::core::ptr::write);
Expand Down Expand Up @@ -273,7 +278,9 @@ fn init_fields(
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#(#cfgs)*
#[allow(unused_variables)]
// Allow `nonstandard_style` since the same warning is going to be reported for
// the struct field.
#[allow(unused_variables, nonstandard_style)]
let #ident = #accessor;
}
}
Expand Down Expand Up @@ -325,7 +332,9 @@ fn init_fields(
#value_init
}
#(#cfgs)*
#[allow(unused_variables)]
// Allow `nonstandard_style` since the same warning is going to be reported for
// the struct field.
#[allow(unused_variables, nonstandard_style)]
let #ident = #accessor;
}
}
Expand Down
12 changes: 10 additions & 2 deletions internal/src/pin_data.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,10 @@ fn generate_unpin_impl(
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`.
#[allow(dead_code)] // The fields below are never used.
#[allow(
dead_code, // The fields below are never used.
nonstandard_style // The warning will be emitted on the struct definition.
)]
struct __Unpin #generics_with_pin_lt
#where_token
#predicates
Expand Down Expand Up @@ -302,7 +305,9 @@ fn generate_projections(
let docs = format!(" Pin-projections of [`{ident}`]");
quote! {
#[doc = #docs]
#[allow(dead_code)]
// Allow `nonstandard_style` since the same warning will be emitted on
// the struct definition.
#[allow(dead_code, nonstandard_style)]
#[doc(hidden)]
#vis struct #projection #generics_with_pin_lt {
#(#fields_decl)*
Expand Down Expand Up @@ -395,6 +400,9 @@ fn generate_the_pin_data(
/// to deallocate.
#pin_safety
#(#attrs)*
// Allow `nonstandard_style` since the same warning will be emitted on
// the struct definition.
#[allow(nonstandard_style)]
#vis unsafe fn #ident<E>(
self,
slot: *mut #ty,
Expand Down
50 changes: 50 additions & 0 deletions tests/nonstandard_style.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
//! Tests that no extra warnings are emitted for non-standard style fields when using `init!`
//! or `pin_init!`.
//!
//! See: https://github.com/Rust-for-Linux/pin-init/issues/125

// Should be implied by crate lint settings, but just to be sure:
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sentence doesn't need to be here; this is an integral part of the test.

#![deny(nonstandard_style)]
#![allow(dead_code)]
#![cfg_attr(USE_RUSTC_FEATURES, feature(lint_reasons))]
#![cfg_attr(USE_RUSTC_FEATURES, feature(raw_ref_op))]

use pin_init::*;

#[allow(nonstandard_style)]
struct Foo {
NON_STANDARD_A: usize,
nonStandardB: Bar,
}

// Make sure `allow(non_snake_case)` also works.
#[allow(non_snake_case)]
struct Bar {
Non_Standard_C: usize,
}

impl Foo {
fn new() -> impl Init<Self> {
init!(Self {
NON_STANDARD_A: 42,
nonStandardB <- init!(Bar { Non_Standard_C: 42 }),
})
}
}

#[allow(nonstandard_style)]
#[pin_data]
struct Baz {
NON_STANDARD: usize,
#[pin]
nonStandardPin: usize,
}

impl Baz {
fn new(a: impl PinInit<usize>) -> impl PinInit<Self> {
pin_init!(Self {
NON_STANDARD: 42,
nonStandardPin <- a,
})
}
}
7 changes: 5 additions & 2 deletions tests/ui/expand/many_generics.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ where
_pin: PhantomPinned,
}
/// Pin-projections of [`Foo`]
#[allow(dead_code)]
#[allow(dead_code, nonstandard_style)]
#[doc(hidden)]
struct FooProjection<
'__pin,
Expand Down Expand Up @@ -92,6 +92,7 @@ const _: () = {
/// - `slot` is a valid pointer to uninitialized memory.
/// - the caller does not touch `slot` when `Err` is returned, they are only permitted
/// to deallocate.
#[allow(nonstandard_style)]
unsafe fn array<E>(
self,
slot: *mut [u8; 1024 * 1024],
Expand All @@ -113,6 +114,7 @@ const _: () = {
/// - `slot` is a valid pointer to uninitialized memory.
/// - the caller does not touch `slot` when `Err` is returned, they are only permitted
/// to deallocate.
#[allow(nonstandard_style)]
unsafe fn r<E>(
self,
slot: *mut &'b mut [&'a mut T; SIZE],
Expand All @@ -135,6 +137,7 @@ const _: () = {
/// - the caller does not touch `slot` when `Err` is returned, they are only permitted
/// to deallocate.
/// - `slot` will not move until it is dropped, i.e. it will be pinned.
#[allow(nonstandard_style)]
unsafe fn _pin<E>(
self,
slot: *mut PhantomPinned,
Expand Down Expand Up @@ -179,7 +182,7 @@ const _: () = {
{
type Datee = Foo<'a, 'b, T, SIZE>;
}
#[allow(dead_code)]
#[allow(dead_code, nonstandard_style)]
struct __Unpin<'__pin, 'a, 'b: 'a, T: Bar<'b> + ?Sized + 'a, const SIZE: usize = 0>
where
T: Bar<'a, 1>,
Expand Down
6 changes: 4 additions & 2 deletions tests/ui/expand/pin-data.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ struct Foo {
_pin: PhantomPinned,
}
/// Pin-projections of [`Foo`]
#[allow(dead_code)]
#[allow(dead_code, nonstandard_style)]
#[doc(hidden)]
struct FooProjection<'__pin> {
array: &'__pin mut [u8; 1024 * 1024],
Expand Down Expand Up @@ -51,6 +51,7 @@ const _: () = {
/// - `slot` is a valid pointer to uninitialized memory.
/// - the caller does not touch `slot` when `Err` is returned, they are only permitted
/// to deallocate.
#[allow(nonstandard_style)]
unsafe fn array<E>(
self,
slot: *mut [u8; 1024 * 1024],
Expand All @@ -73,6 +74,7 @@ const _: () = {
/// - the caller does not touch `slot` when `Err` is returned, they are only permitted
/// to deallocate.
/// - `slot` will not move until it is dropped, i.e. it will be pinned.
#[allow(nonstandard_style)]
unsafe fn _pin<E>(
self,
slot: *mut PhantomPinned,
Expand Down Expand Up @@ -101,7 +103,7 @@ const _: () = {
unsafe impl ::pin_init::__internal::PinData for __ThePinData {
type Datee = Foo;
}
#[allow(dead_code)]
#[allow(dead_code, nonstandard_style)]
struct __Unpin<'__pin> {
__phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
__phantom: ::core::marker::PhantomData<fn(Foo) -> Foo>,
Expand Down
6 changes: 4 additions & 2 deletions tests/ui/expand/pinned_drop.expanded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ struct Foo {
_pin: PhantomPinned,
}
/// Pin-projections of [`Foo`]
#[allow(dead_code)]
#[allow(dead_code, nonstandard_style)]
#[doc(hidden)]
struct FooProjection<'__pin> {
array: &'__pin mut [u8; 1024 * 1024],
Expand Down Expand Up @@ -51,6 +51,7 @@ const _: () = {
/// - `slot` is a valid pointer to uninitialized memory.
/// - the caller does not touch `slot` when `Err` is returned, they are only permitted
/// to deallocate.
#[allow(nonstandard_style)]
unsafe fn array<E>(
self,
slot: *mut [u8; 1024 * 1024],
Expand All @@ -73,6 +74,7 @@ const _: () = {
/// - the caller does not touch `slot` when `Err` is returned, they are only permitted
/// to deallocate.
/// - `slot` will not move until it is dropped, i.e. it will be pinned.
#[allow(nonstandard_style)]
unsafe fn _pin<E>(
self,
slot: *mut PhantomPinned,
Expand Down Expand Up @@ -101,7 +103,7 @@ const _: () = {
unsafe impl ::pin_init::__internal::PinData for __ThePinData {
type Datee = Foo;
}
#[allow(dead_code)]
#[allow(dead_code, nonstandard_style)]
struct __Unpin<'__pin> {
__phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
__phantom: ::core::marker::PhantomData<fn(Foo) -> Foo>,
Expand Down
Loading