@@ -4,7 +4,7 @@ use rustc_attr_data_structures::{AttributeKind, IntType, ReprAttr};
4
4
use rustc_feature:: { AttributeTemplate , template} ;
5
5
use rustc_span:: { DUMMY_SP , Span , Symbol , sym} ;
6
6
7
- use super :: { CombineAttributeParser , ConvertFn } ;
7
+ use super :: { AcceptMapping , AttributeParser , CombineAttributeParser , ConvertFn , FinalizeContext } ;
8
8
use crate :: context:: { AcceptContext , Stage } ;
9
9
use crate :: parser:: { ArgParser , MetaItemListParser , MetaItemParser } ;
10
10
use crate :: session_diagnostics;
@@ -203,7 +203,7 @@ fn parse_repr_align<S: Stage>(
203
203
} ) ;
204
204
}
205
205
Align => {
206
- cx. dcx ( ) . emit_err ( session_diagnostics:: IncorrectReprFormatAlignOneArg {
206
+ cx. emit_err ( session_diagnostics:: IncorrectReprFormatAlignOneArg {
207
207
span : param_span,
208
208
} ) ;
209
209
}
@@ -266,3 +266,57 @@ fn parse_alignment(node: &LitKind) -> Result<Align, &'static str> {
266
266
Err ( "not an unsuffixed integer" )
267
267
}
268
268
}
269
+
270
+ /// Parse #[align(N)].
271
+ #[ derive( Default ) ]
272
+ pub ( crate ) struct AlignParser ( Option < ( Align , Span ) > ) ;
273
+
274
+ impl AlignParser {
275
+ const PATH : & ' static [ Symbol ] = & [ sym:: align] ;
276
+ const TEMPLATE : AttributeTemplate = template ! ( Word , List : "<alignment in bytes>" ) ;
277
+
278
+ fn parse < ' c , S : Stage > (
279
+ & mut self ,
280
+ cx : & ' c mut AcceptContext < ' _ , ' _ , S > ,
281
+ args : & ' c ArgParser < ' _ > ,
282
+ ) {
283
+ match args {
284
+ ArgParser :: NoArgs | ArgParser :: NameValue ( _) => {
285
+ cx. expected_list ( cx. attr_span ) ;
286
+ }
287
+ ArgParser :: List ( list) => {
288
+ let Some ( align) = list. single ( ) else {
289
+ cx. expected_single_argument ( list. span ) ;
290
+ return ;
291
+ } ;
292
+
293
+ let Some ( lit) = align. lit ( ) else {
294
+ cx. emit_err ( session_diagnostics:: IncorrectReprFormatExpectInteger {
295
+ span : align. span ( ) ,
296
+ } ) ;
297
+
298
+ return ;
299
+ } ;
300
+
301
+ match parse_alignment ( & lit. kind ) {
302
+ Ok ( literal) => self . 0 = Ord :: max ( self . 0 , Some ( ( literal, cx. attr_span ) ) ) ,
303
+ Err ( message) => {
304
+ cx. emit_err ( session_diagnostics:: InvalidAlignmentValue {
305
+ span : lit. span ,
306
+ error_part : message,
307
+ } ) ;
308
+ }
309
+ }
310
+ }
311
+ }
312
+ }
313
+ }
314
+
315
+ impl < S : Stage > AttributeParser < S > for AlignParser {
316
+ const ATTRIBUTES : AcceptMapping < Self , S > = & [ ( Self :: PATH , Self :: TEMPLATE , Self :: parse) ] ;
317
+
318
+ fn finalize ( self , _cx : & FinalizeContext < ' _ , ' _ , S > ) -> Option < AttributeKind > {
319
+ let ( align, span) = self . 0 ?;
320
+ Some ( AttributeKind :: Align { align, span } )
321
+ }
322
+ }
0 commit comments