@@ -22,8 +22,8 @@ use tracing::debug;
2222use super :: diagnostics:: { ConsumeClosingDelim , dummy_arg} ;
2323use super :: ty:: { AllowPlus , RecoverQPath , RecoverReturnSign } ;
2424use super :: {
25- AttrWrapper , ExpKeywordPair , ExpTokenPair , FollowedByType , ForceCollect , Parser , PathStyle ,
26- Recovered , Trailing , UsePreAttrPos ,
25+ AttrWrapper , ConstBlockItemsAllowed , ExpKeywordPair , ExpTokenPair , FollowedByType ,
26+ ForceCollect , Parser , PathStyle , Recovered , Trailing , UsePreAttrPos ,
2727} ;
2828use crate :: errors:: { self , FnPointerCannotBeAsync , FnPointerCannotBeConst , MacroExpandsToAdtField } ;
2929use crate :: { exp, fluent_generated as fluent} ;
@@ -69,7 +69,7 @@ impl<'a> Parser<'a> {
6969 // `parse_item` consumes the appropriate semicolons so any leftover is an error.
7070 loop {
7171 while self . maybe_consume_incorrect_semicolon ( items. last ( ) . map ( |x| & * * x) ) { } // Eat all bad semicolons
72- let Some ( item) = self . parse_item ( ForceCollect :: No ) ? else {
72+ let Some ( item) = self . parse_item ( ForceCollect :: No , ConstBlockItemsAllowed :: Yes ) ? else {
7373 break ;
7474 } ;
7575 items. push ( item) ;
@@ -118,21 +118,34 @@ impl<'a> Parser<'a> {
118118}
119119
120120impl < ' a > Parser < ' a > {
121- pub fn parse_item ( & mut self , force_collect : ForceCollect ) -> PResult < ' a , Option < Box < Item > > > {
121+ pub fn parse_item (
122+ & mut self ,
123+ force_collect : ForceCollect ,
124+ const_block_items_allowed : ConstBlockItemsAllowed ,
125+ ) -> PResult < ' a , Option < Box < Item > > > {
122126 let fn_parse_mode =
123127 FnParseMode { req_name : |_, _| true , context : FnContext :: Free , req_body : true } ;
124- self . parse_item_ ( fn_parse_mode, force_collect) . map ( |i| i. map ( Box :: new) )
128+ self . parse_item_ ( fn_parse_mode, force_collect, const_block_items_allowed)
129+ . map ( |i| i. map ( Box :: new) )
125130 }
126131
127132 fn parse_item_ (
128133 & mut self ,
129134 fn_parse_mode : FnParseMode ,
130135 force_collect : ForceCollect ,
136+ const_block_items_allowed : ConstBlockItemsAllowed ,
131137 ) -> PResult < ' a , Option < Item > > {
132138 self . recover_vcs_conflict_marker ( ) ;
133139 let attrs = self . parse_outer_attributes ( ) ?;
134140 self . recover_vcs_conflict_marker ( ) ;
135- self . parse_item_common ( attrs, true , false , fn_parse_mode, force_collect)
141+ self . parse_item_common (
142+ attrs,
143+ true ,
144+ false ,
145+ fn_parse_mode,
146+ force_collect,
147+ const_block_items_allowed,
148+ )
136149 }
137150
138151 pub ( super ) fn parse_item_common (
@@ -142,10 +155,11 @@ impl<'a> Parser<'a> {
142155 attrs_allowed : bool ,
143156 fn_parse_mode : FnParseMode ,
144157 force_collect : ForceCollect ,
158+ const_block_items_allowed : ConstBlockItemsAllowed ,
145159 ) -> PResult < ' a , Option < Item > > {
146- if let Some ( item) =
147- self . eat_metavar_seq ( MetaVarKind :: Item , | this| this . parse_item ( ForceCollect :: Yes ) )
148- {
160+ if let Some ( item) = self . eat_metavar_seq ( MetaVarKind :: Item , |this| {
161+ this. parse_item ( ForceCollect :: Yes , const_block_items_allowed )
162+ } ) {
149163 let mut item = item. expect ( "an actual item" ) ;
150164 attrs. prepend_to_nt_inner ( & mut item. attrs ) ;
151165 return Ok ( Some ( * item) ) ;
@@ -158,6 +172,7 @@ impl<'a> Parser<'a> {
158172 let kind = this. parse_item_kind (
159173 & mut attrs,
160174 mac_allowed,
175+ const_block_items_allowed,
161176 lo,
162177 & vis,
163178 & mut def,
@@ -204,6 +219,7 @@ impl<'a> Parser<'a> {
204219 & mut self ,
205220 attrs : & mut AttrVec ,
206221 macros_allowed : bool ,
222+ const_block_items_allowed : ConstBlockItemsAllowed ,
207223 lo : Span ,
208224 vis : & Visibility ,
209225 def : & mut Defaultness ,
@@ -251,6 +267,34 @@ impl<'a> Parser<'a> {
251267 } else if self . check_impl_frontmatter ( ) {
252268 // IMPL ITEM
253269 self . parse_item_impl ( attrs, def_ ( ) ) ?
270+ } else if let ConstBlockItemsAllowed :: Yes = const_block_items_allowed
271+ && self . token . is_keyword ( kw:: Const )
272+ && self . look_ahead ( 1 , |t| * t == token:: OpenBrace || t. is_metavar_block ( ) )
273+ {
274+ // CONST BLOCK ITEM
275+ self . psess . gated_spans . gate ( sym:: const_block_items, self . token . span ) ;
276+ let block = self . parse_const_block ( DUMMY_SP , false ) ?;
277+ ItemKind :: Const ( Box :: new ( ConstItem {
278+ defaultness : Defaultness :: Final ,
279+ ident : Ident { name : kw:: Underscore , span : DUMMY_SP } ,
280+ generics : Generics {
281+ params : thin_vec ! [ ] ,
282+ where_clause : WhereClause {
283+ has_where_token : false ,
284+ predicates : thin_vec ! [ ] ,
285+ span : DUMMY_SP ,
286+ } ,
287+ span : DUMMY_SP ,
288+ } ,
289+ ty : Box :: new ( Ty {
290+ id : DUMMY_NODE_ID ,
291+ kind : TyKind :: Tup ( thin_vec ! [ ] ) ,
292+ span : DUMMY_SP ,
293+ tokens : None ,
294+ } ) ,
295+ rhs : Some ( ConstItemRhs :: Body ( block) ) ,
296+ define_opaque : None ,
297+ } ) )
254298 } else if let Const :: Yes ( const_span) = self . parse_constness ( case) {
255299 // CONST ITEM
256300 self . recover_const_mut ( const_span) ;
@@ -310,6 +354,7 @@ impl<'a> Parser<'a> {
310354 return self . parse_item_kind (
311355 attrs,
312356 macros_allowed,
357+ const_block_items_allowed,
313358 lo,
314359 vis,
315360 def,
@@ -990,7 +1035,7 @@ impl<'a> Parser<'a> {
9901035 fn_parse_mode : FnParseMode ,
9911036 force_collect : ForceCollect ,
9921037 ) -> PResult < ' a , Option < Option < Box < AssocItem > > > > {
993- Ok ( self . parse_item_ ( fn_parse_mode, force_collect) ?. map (
1038+ Ok ( self . parse_item_ ( fn_parse_mode, force_collect, ConstBlockItemsAllowed :: No ) ?. map (
9941039 |Item { attrs, id, span, vis, kind, tokens } | {
9951040 let kind = match AssocItemKind :: try_from ( kind) {
9961041 Ok ( kind) => kind,
@@ -1242,7 +1287,7 @@ impl<'a> Parser<'a> {
12421287 context : FnContext :: Free ,
12431288 req_body : false ,
12441289 } ;
1245- Ok ( self . parse_item_ ( fn_parse_mode, force_collect) ?. map (
1290+ Ok ( self . parse_item_ ( fn_parse_mode, force_collect, ConstBlockItemsAllowed :: No ) ?. map (
12461291 |Item { attrs, id, span, vis, kind, tokens } | {
12471292 let kind = match ForeignItemKind :: try_from ( kind) {
12481293 Ok ( kind) => kind,
@@ -2307,7 +2352,7 @@ impl<'a> Parser<'a> {
23072352 {
23082353 let kw_token = self . token ;
23092354 let kw_str = pprust:: token_to_string ( & kw_token) ;
2310- let item = self . parse_item ( ForceCollect :: No ) ?;
2355+ let item = self . parse_item ( ForceCollect :: No , ConstBlockItemsAllowed :: No ) ?;
23112356 let mut item = item. unwrap ( ) . span ;
23122357 if self . token == token:: Comma {
23132358 item = item. to ( self . token . span ) ;
0 commit comments