@@ -106,23 +106,24 @@ pub trait KindRepr: 'static + Sized + Ord {
106
106
// etc), and provide implementations of `KindRepr`, `Ord`, and `Display`, and
107
107
// those traits' super-traits.
108
108
macro_rules! define_kind_specific_repr {
109
- ( $type_name: expr, $repr_name: ident, $( $repr_variant: ident) ,* ) => {
109
+ ( $type_name: expr, $repr_name: ident, [ $( $repr_variant: ident) ,* ] , [ $ ( $repr_variant_aligned : ident ) , * ] ) => {
110
110
#[ derive( Copy , Clone , Debug , Eq , PartialEq ) ]
111
111
pub enum $repr_name {
112
112
$( $repr_variant, ) *
113
- Align ( u64 ) ,
113
+ $ ( $repr_variant_aligned ( u64 ) , ) *
114
114
}
115
115
116
116
impl KindRepr for $repr_name {
117
117
fn is_align( & self ) -> bool {
118
118
match self {
119
- $repr_name:: Align ( _) => true ,
119
+ $( $ repr_name:: $repr_variant_aligned ( _) => true , ) *
120
120
_ => false ,
121
121
}
122
122
}
123
123
124
124
fn is_align_gt_one( & self ) -> bool {
125
125
match self {
126
+ // `packed(n)` only lowers alignment
126
127
$repr_name:: Align ( n) => n > & 1 ,
127
128
_ => false ,
128
129
}
@@ -131,7 +132,7 @@ macro_rules! define_kind_specific_repr {
131
132
fn parse( meta: & Meta ) -> syn:: Result <$repr_name> {
132
133
match Repr :: from_meta( meta) ? {
133
134
$( Repr :: $repr_variant => Ok ( $repr_name:: $repr_variant) , ) *
134
- Repr :: Align ( u) => Ok ( $repr_name:: Align ( u) ) ,
135
+ $ ( Repr :: $repr_variant_aligned ( u) => Ok ( $repr_name:: $repr_variant_aligned ( u) ) , ) *
135
136
_ => Err ( Error :: new_spanned( meta, concat!( "unsupported representation for deriving FromBytes, AsBytes, or Unaligned on " , $type_name) ) )
136
137
}
137
138
}
@@ -155,16 +156,19 @@ macro_rules! define_kind_specific_repr {
155
156
fn fmt( & self , f: & mut core:: fmt:: Formatter <' _>) -> core:: fmt:: Result {
156
157
match self {
157
158
$( $repr_name:: $repr_variant => Repr :: $repr_variant, ) *
158
- $repr_name:: Align ( u) => Repr :: Align ( * u) ,
159
+ $( $ repr_name:: $repr_variant_aligned ( u) => Repr :: $repr_variant_aligned ( * u) , ) *
159
160
} . fmt( f)
160
161
}
161
162
}
162
163
}
163
164
}
164
165
165
- define_kind_specific_repr ! ( "a struct" , StructRepr , C , Transparent , Packed ) ;
166
+ define_kind_specific_repr ! ( "a struct" , StructRepr , [ C , Transparent , Packed ] , [ Align , PackedN ] ) ;
166
167
define_kind_specific_repr ! (
167
- "an enum" , EnumRepr , C , U8 , U16 , U32 , U64 , Usize , I8 , I16 , I32 , I64 , Isize
168
+ "an enum" ,
169
+ EnumRepr ,
170
+ [ C , U8 , U16 , U32 , U64 , Usize , I8 , I16 , I32 , I64 , Isize ] ,
171
+ [ Align ]
168
172
) ;
169
173
170
174
// All representations known to Rust.
0 commit comments