@@ -90,7 +90,6 @@ impl<'src> Parser<'_, '_, 'src> {
9090 | TokenKind :: Macro
9191 | TokenKind :: Struct
9292 | TokenKind :: Trait
93- | TokenKind :: Type
9493 | TokenKind :: Use => return true ,
9594 TokenKind :: CommonIdent => match self . source ( self . token . span ) {
9695 weak:: Union :: STR => return weak:: Union . qualifies ( self ) ,
@@ -146,13 +145,22 @@ impl<'src> Parser<'_, '_, 'src> {
146145 // FIXME: Provide more targeted diagnostics if the qualifiers don't make sense.
147146 match qualifiers. as_slice ( ) {
148147 [ ] => { }
149- [ Qualifier :: Const ] => {
150- return if self . consume ( TokenKind :: OpenCurlyBracket ) {
151- // FEATURE: `const_block_items` <https://github.com/rust-lang/rust/issues/149226>
152- self . fin_parse_const_block_item ( )
153- } else {
154- self . fin_parse_const_item ( defaultness)
148+ [ Qualifier :: Type ] => return self . fin_parse_ty_alias_item ( defaultness) ,
149+ // FEATURE: `const_block_items` <https://github.com/rust-lang/rust/issues/149226>
150+ [ Qualifier :: Const ] if self . consume ( TokenKind :: OpenCurlyBracket ) => {
151+ return self . fin_parse_const_block_item ( ) ;
152+ }
153+ [ qualifiers @ .., Qualifier :: Const ] => {
154+ // FEATURE: `min_generic_const_args` <https://github.com/rust-lang/rust/issues/132980>
155+ let ( tyness, qualifiers) = match qualifiers {
156+ [ Qualifier :: Type , qualifiers @ ..] => ( ast:: Tyness :: Ty , qualifiers) ,
157+ _ => ( ast:: Tyness :: Not , qualifiers) ,
155158 } ;
159+ if !qualifiers. is_empty ( ) {
160+ return self . fatal ( Error :: InvalidItemPrefix ( start. until ( self . token . span ) ) ) ;
161+ }
162+
163+ return self . fin_parse_const_item ( defaultness, tyness) ;
156164 }
157165 // `crate` can't be a qualifier itself because it may also begin paths & it's not worth the look-ahead.
158166 [ Qualifier :: Extern ( None ) ] if self . consume ( TokenKind :: Crate ) => {
@@ -265,10 +273,6 @@ impl<'src> Parser<'_, '_, 'src> {
265273 self . advance ( ) ;
266274 return self . fin_parse_struct_item ( ) ;
267275 }
268- TokenKind :: Type => {
269- self . advance ( ) ;
270- return self . fin_parse_ty_alias_item ( defaultness) ;
271- }
272276 TokenKind :: Use => {
273277 self . advance ( ) ;
274278 return self . fin_parse_use_item ( ) ;
@@ -333,6 +337,7 @@ impl<'src> Parser<'_, '_, 'src> {
333337 TokenKind :: Mod => Qualifier :: Mod ,
334338 TokenKind :: Static => Qualifier :: Static ,
335339 TokenKind :: Trait => Qualifier :: Trait ,
340+ TokenKind :: Type => Qualifier :: Type ,
336341 TokenKind :: Unsafe if self . peek ( 1 ) . kind != TokenKind :: OpenCurlyBracket => {
337342 Qualifier :: Unsafe
338343 }
@@ -359,6 +364,7 @@ impl<'src> Parser<'_, '_, 'src> {
359364 fn fin_parse_const_item (
360365 & mut self ,
361366 defaultness : ast:: Defaultness ,
367+ tyness : ast:: Tyness ,
362368 ) -> Result < ast:: ItemKind < ' src > > {
363369 let ( binder, _) = self . parse_common_ident_or ( TokenKind :: Underscore ) ?;
364370 // FEATURE: `generic_const_items` <https://github.com/rust-lang/rust/issues/113521>
@@ -371,6 +377,7 @@ impl<'src> Parser<'_, '_, 'src> {
371377
372378 Ok ( ast:: ItemKind :: Const ( Box :: new ( ast:: ConstItem {
373379 defaultness,
380+ tyness,
374381 binder,
375382 generics : ast:: Generics { params, preds } ,
376383 ty,
@@ -1101,6 +1108,7 @@ enum Qualifier<'src> {
11011108 Safe ,
11021109 Static ,
11031110 Trait ,
1111+ Type ,
11041112 Unsafe ,
11051113}
11061114
0 commit comments