Re: [PATCH v2 2/3] rust: macros: allow generic parameter default values in `#[pin_data]`

From: Martin Rodriguez Reboredo
Date: Wed Dec 13 2023 - 22:14:02 EST


On 12/13/23 19:08, Benno Lossin wrote:
Add support for generic parameters defaults in `#[pin_data]` by using
the newly introduced `decl_generics` instead of the `impl_generics`.

Before this would not compile:

#[pin_data]
struct Foo<const N: usize = 0> {
// ...
}

because it would be expanded to this:

struct Foo<const N: usize = 0> {
// ...
}

const _: () = {
struct __ThePinData<const N: usize = 0> {
__phantom: ::core::marker::PhantomData<fn(Foo<N>) -> Foo<N>>,
}
impl<const N: usize = 0> ::core::clone::Clone for __ThePinData<N> {
fn clone(&self) -> Self {
*self
}
}

// [...] rest of expansion omitted
};

The problem is with the `impl<const N: usize = 0>`, since that is
invalid Rust syntax. It should not mention the default value at all,
since default values only make sense on type definitions.

The new `impl_generics` do not contain the default values, thus
generating correct Rust code.

This is used by the next commit that puts `#[pin_data]` on
`kernel::workqueue::Work`.

Signed-off-by: Benno Lossin <benno.lossin@xxxxxxxxx>
---
[...]
Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@xxxxxxxxx>