Skip to content

Commit f43cab8

Browse files
y86-devfbq
authored andcommitted
rust: macros: allow generic parameter default values in #[pin_data]
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 <[email protected]> Reviewed-by: Martin Rodriguez Reboredo <[email protected]> Reviewed-by: Gary Guo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent f68f58f commit f43cab8

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

rust/kernel/init/macros.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,7 @@ macro_rules! __pin_data {
538538
),
539539
@impl_generics($($impl_generics:tt)*),
540540
@ty_generics($($ty_generics:tt)*),
541+
@decl_generics($($decl_generics:tt)*),
541542
@body({ $($fields:tt)* }),
542543
) => {
543544
// We now use token munching to iterate through all of the fields. While doing this we
@@ -560,6 +561,9 @@ macro_rules! __pin_data {
560561
@impl_generics($($impl_generics)*),
561562
// The 'ty generics', the generics that will need to be specified on the impl blocks.
562563
@ty_generics($($ty_generics)*),
564+
// The 'decl generics', the generics that need to be specified on the struct
565+
// definition.
566+
@decl_generics($($decl_generics)*),
563567
// The where clause of any impl block and the declaration.
564568
@where($($($whr)*)?),
565569
// The remaining fields tokens that need to be processed.
@@ -585,6 +589,7 @@ macro_rules! __pin_data {
585589
@name($name:ident),
586590
@impl_generics($($impl_generics:tt)*),
587591
@ty_generics($($ty_generics:tt)*),
592+
@decl_generics($($decl_generics:tt)*),
588593
@where($($whr:tt)*),
589594
// We found a PhantomPinned field, this should generally be pinned!
590595
@fields_munch($field:ident : $($($(::)?core::)?marker::)?PhantomPinned, $($rest:tt)*),
@@ -607,6 +612,7 @@ macro_rules! __pin_data {
607612
@name($name),
608613
@impl_generics($($impl_generics)*),
609614
@ty_generics($($ty_generics)*),
615+
@decl_generics($($decl_generics)*),
610616
@where($($whr)*),
611617
@fields_munch($($rest)*),
612618
@pinned($($pinned)* $($accum)* $field: ::core::marker::PhantomPinned,),
@@ -623,6 +629,7 @@ macro_rules! __pin_data {
623629
@name($name:ident),
624630
@impl_generics($($impl_generics:tt)*),
625631
@ty_generics($($ty_generics:tt)*),
632+
@decl_generics($($decl_generics:tt)*),
626633
@where($($whr:tt)*),
627634
// We reached the field declaration.
628635
@fields_munch($field:ident : $type:ty, $($rest:tt)*),
@@ -640,6 +647,7 @@ macro_rules! __pin_data {
640647
@name($name),
641648
@impl_generics($($impl_generics)*),
642649
@ty_generics($($ty_generics)*),
650+
@decl_generics($($decl_generics)*),
643651
@where($($whr)*),
644652
@fields_munch($($rest)*),
645653
@pinned($($pinned)* $($accum)* $field: $type,),
@@ -656,6 +664,7 @@ macro_rules! __pin_data {
656664
@name($name:ident),
657665
@impl_generics($($impl_generics:tt)*),
658666
@ty_generics($($ty_generics:tt)*),
667+
@decl_generics($($decl_generics:tt)*),
659668
@where($($whr:tt)*),
660669
// We reached the field declaration.
661670
@fields_munch($field:ident : $type:ty, $($rest:tt)*),
@@ -673,6 +682,7 @@ macro_rules! __pin_data {
673682
@name($name),
674683
@impl_generics($($impl_generics)*),
675684
@ty_generics($($ty_generics)*),
685+
@decl_generics($($decl_generics)*),
676686
@where($($whr)*),
677687
@fields_munch($($rest)*),
678688
@pinned($($pinned)*),
@@ -689,6 +699,7 @@ macro_rules! __pin_data {
689699
@name($name:ident),
690700
@impl_generics($($impl_generics:tt)*),
691701
@ty_generics($($ty_generics:tt)*),
702+
@decl_generics($($decl_generics:tt)*),
692703
@where($($whr:tt)*),
693704
// We found the `#[pin]` attr.
694705
@fields_munch(#[pin] $($rest:tt)*),
@@ -705,6 +716,7 @@ macro_rules! __pin_data {
705716
@name($name),
706717
@impl_generics($($impl_generics)*),
707718
@ty_generics($($ty_generics)*),
719+
@decl_generics($($decl_generics)*),
708720
@where($($whr)*),
709721
@fields_munch($($rest)*),
710722
// We do not include `#[pin]` in the list of attributes, since it is not actually an
@@ -724,6 +736,7 @@ macro_rules! __pin_data {
724736
@name($name:ident),
725737
@impl_generics($($impl_generics:tt)*),
726738
@ty_generics($($ty_generics:tt)*),
739+
@decl_generics($($decl_generics:tt)*),
727740
@where($($whr:tt)*),
728741
// We reached the field declaration with visibility, for simplicity we only munch the
729742
// visibility and put it into `$accum`.
@@ -741,6 +754,7 @@ macro_rules! __pin_data {
741754
@name($name),
742755
@impl_generics($($impl_generics)*),
743756
@ty_generics($($ty_generics)*),
757+
@decl_generics($($decl_generics)*),
744758
@where($($whr)*),
745759
@fields_munch($field $($rest)*),
746760
@pinned($($pinned)*),
@@ -757,6 +771,7 @@ macro_rules! __pin_data {
757771
@name($name:ident),
758772
@impl_generics($($impl_generics:tt)*),
759773
@ty_generics($($ty_generics:tt)*),
774+
@decl_generics($($decl_generics:tt)*),
760775
@where($($whr:tt)*),
761776
// Some other attribute, just put it into `$accum`.
762777
@fields_munch(#[$($attr:tt)*] $($rest:tt)*),
@@ -773,6 +788,7 @@ macro_rules! __pin_data {
773788
@name($name),
774789
@impl_generics($($impl_generics)*),
775790
@ty_generics($($ty_generics)*),
791+
@decl_generics($($decl_generics)*),
776792
@where($($whr)*),
777793
@fields_munch($($rest)*),
778794
@pinned($($pinned)*),
@@ -789,6 +805,7 @@ macro_rules! __pin_data {
789805
@name($name:ident),
790806
@impl_generics($($impl_generics:tt)*),
791807
@ty_generics($($ty_generics:tt)*),
808+
@decl_generics($($decl_generics:tt)*),
792809
@where($($whr:tt)*),
793810
// We reached the end of the fields, plus an optional additional comma, since we added one
794811
// before and the user is also allowed to put a trailing comma.
@@ -802,7 +819,7 @@ macro_rules! __pin_data {
802819
) => {
803820
// Declare the struct with all fields in the correct order.
804821
$($struct_attrs)*
805-
$vis struct $name <$($impl_generics)*>
822+
$vis struct $name <$($decl_generics)*>
806823
where $($whr)*
807824
{
808825
$($fields)*

rust/macros/pin_data.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub(crate) fn pin_data(args: TokenStream, input: TokenStream) -> TokenStream {
1010
let (
1111
Generics {
1212
impl_generics,
13-
decl_generics: _,
13+
decl_generics,
1414
ty_generics,
1515
},
1616
rest,
@@ -77,6 +77,7 @@ pub(crate) fn pin_data(args: TokenStream, input: TokenStream) -> TokenStream {
7777
@sig(#(#rest)*),
7878
@impl_generics(#(#impl_generics)*),
7979
@ty_generics(#(#ty_generics)*),
80+
@decl_generics(#(#decl_generics)*),
8081
@body(#last),
8182
});
8283
quoted.extend(errs);

0 commit comments

Comments
 (0)