@@ -197,6 +197,7 @@ ast_struct! {
197197 pub attrs: Vec <Attribute >,
198198 pub defaultness: Option <Token ![ default ] >,
199199 pub unsafety: Option <Token ![ unsafe ] >,
200+ pub constness: Option <Token ![ const ] >,
200201 pub impl_token: Token ![ impl ] ,
201202 pub generics: Generics ,
202203 /// Trait this impl implements.
@@ -278,6 +279,7 @@ ast_struct! {
278279 pub vis: Visibility ,
279280 pub unsafety: Option <Token ![ unsafe ] >,
280281 pub auto_token: Option <Token ![ auto] >,
282+ pub constness: Option <Token ![ const ] >,
281283 pub restriction: Option <ImplRestriction >,
282284 pub trait_token: Token ![ trait ] ,
283285 pub ident: Ident ,
@@ -1110,7 +1112,10 @@ pub(crate) mod parsing {
11101112 } ) )
11111113 }
11121114 }
1113- } else if lookahead. peek ( Token ! [ const ] ) {
1115+ } else if lookahead. peek ( Token ! [ const ] )
1116+ && !ahead. peek2 ( Token ! [ impl ] )
1117+ && !ahead. peek2 ( Token ! [ trait ] )
1118+ {
11141119 let vis = input. parse ( ) ?;
11151120 let publish = input. parse ( ) ?;
11161121 let mode = input. parse ( ) ?;
@@ -1200,7 +1205,10 @@ pub(crate) mod parsing {
12001205 input. call ( parse_trait_or_trait_alias)
12011206 } else if lookahead. peek ( Token ! [ auto] ) && ahead. peek2 ( Token ! [ trait ] ) {
12021207 input. parse ( ) . map ( Item :: Trait )
1208+ } else if lookahead. peek ( Token ! [ const ] ) && ahead. peek2 ( Token ! [ trait ] ) {
1209+ input. parse ( ) . map ( Item :: Trait )
12031210 } else if lookahead. peek ( Token ! [ impl ] )
1211+ || lookahead. peek ( Token ! [ const ] ) && ahead. peek2 ( Token ! [ impl ] )
12041212 || lookahead. peek ( Token ! [ default ] ) && !ahead. peek2 ( Token ! [ !] )
12051213 {
12061214 let allow_verbatim_impl = true ;
@@ -2388,12 +2396,14 @@ pub(crate) mod parsing {
23882396 {
23892397 let unsafety = None ;
23902398 let auto_token = None ;
2399+ let const_token = None ;
23912400 parse_rest_of_trait (
23922401 input,
23932402 attrs,
23942403 vis,
23952404 unsafety,
23962405 auto_token,
2406+ const_token,
23972407 trait_token,
23982408 ident,
23992409 generics,
@@ -2414,6 +2424,7 @@ pub(crate) mod parsing {
24142424 let vis: Visibility = input. parse ( ) ?;
24152425 let unsafety: Option < Token ! [ unsafe ] > = input. parse ( ) ?;
24162426 let auto_token: Option < Token ! [ auto] > = input. parse ( ) ?;
2427+ let constness: Option < Token ! [ const ] > = input. parse ( ) ?;
24172428 let trait_token: Token ! [ trait ] = input. parse ( ) ?;
24182429 let ident: Ident = input. parse ( ) ?;
24192430 let generics: Generics = input. parse ( ) ?;
@@ -2423,6 +2434,7 @@ pub(crate) mod parsing {
24232434 vis,
24242435 unsafety,
24252436 auto_token,
2437+ constness,
24262438 trait_token,
24272439 ident,
24282440 generics,
@@ -2436,6 +2448,7 @@ pub(crate) mod parsing {
24362448 vis : Visibility ,
24372449 unsafety : Option < Token ! [ unsafe ] > ,
24382450 auto_token : Option < Token ! [ auto] > ,
2451+ constness : Option < Token ! [ const ] > ,
24392452 trait_token : Token ! [ trait ] ,
24402453 ident : Ident ,
24412454 mut generics : Generics ,
@@ -2475,6 +2488,7 @@ pub(crate) mod parsing {
24752488 vis,
24762489 unsafety,
24772490 auto_token,
2491+ constness,
24782492 restriction : None ,
24792493 trait_token,
24802494 ident,
@@ -2794,6 +2808,7 @@ pub(crate) mod parsing {
27942808 let has_visibility = allow_verbatim_impl && input. parse :: < Visibility > ( ) ?. is_some ( ) ;
27952809 let defaultness: Option < Token ! [ default ] > = input. parse ( ) ?;
27962810 let unsafety: Option < Token ! [ unsafe ] > = input. parse ( ) ?;
2811+ let mut constness: Option < Token ! [ const ] > = input. parse ( ) ?;
27972812 let impl_token: Token ! [ impl ] = input. parse ( ) ?;
27982813
27992814 let has_generics = generics:: parsing:: choose_generics_over_qpath ( input) ;
@@ -2803,11 +2818,8 @@ pub(crate) mod parsing {
28032818 Generics :: default ( )
28042819 } ;
28052820
2806- let is_const_impl = allow_verbatim_impl
2807- && ( input. peek ( Token ! [ const ] ) || input. peek ( Token ! [ ?] ) && input. peek2 ( Token ! [ const ] ) ) ;
2808- if is_const_impl {
2809- input. parse :: < Option < Token ! [ ?] > > ( ) ?;
2810- input. parse :: < Token ! [ const ] > ( ) ?;
2821+ if constness. is_none ( ) {
2822+ constness = input. parse ( ) ?;
28112823 }
28122824
28132825 let polarity = if input. peek ( Token ! [ !] ) && !input. peek2 ( token:: Brace ) {
@@ -2868,13 +2880,14 @@ pub(crate) mod parsing {
28682880 items. push ( content. parse ( ) ?) ;
28692881 }
28702882
2871- if has_visibility || is_const_impl || is_impl_for && trait_. is_none ( ) {
2883+ if has_visibility || is_impl_for && trait_. is_none ( ) {
28722884 Ok ( None )
28732885 } else {
28742886 Ok ( Some ( ItemImpl {
28752887 attrs,
28762888 defaultness,
28772889 unsafety,
2890+ constness,
28782891 impl_token,
28792892 generics,
28802893 trait_,
@@ -3409,6 +3422,7 @@ pub(crate) mod printing {
34093422 self . vis . to_tokens ( tokens) ;
34103423 self . unsafety . to_tokens ( tokens) ;
34113424 self . auto_token . to_tokens ( tokens) ;
3425+ self . constness . to_tokens ( tokens) ;
34123426 self . trait_token . to_tokens ( tokens) ;
34133427 self . ident . to_tokens ( tokens) ;
34143428 self . generics . to_tokens ( tokens) ;
@@ -3445,6 +3459,7 @@ pub(crate) mod printing {
34453459 tokens. append_all ( self . attrs . outer ( ) ) ;
34463460 self . defaultness . to_tokens ( tokens) ;
34473461 self . unsafety . to_tokens ( tokens) ;
3462+ self . constness . to_tokens ( tokens) ;
34483463 self . impl_token . to_tokens ( tokens) ;
34493464 self . generics . to_tokens ( tokens) ;
34503465 if let Some ( ( polarity, path, for_token) ) = & self . trait_ {
0 commit comments