@@ -49,14 +49,14 @@ enum SelfSemantic {
4949}
5050
5151enum TraitOrTraitImpl {
52- Trait { span : Span , constness_span : Option < Span > } ,
52+ Trait { span : Span , constness : Const } ,
5353 TraitImpl { constness : Const , polarity : ImplPolarity , trait_ref_span : Span } ,
5454}
5555
5656impl TraitOrTraitImpl {
5757 fn constness ( & self ) -> Option < Span > {
5858 match self {
59- Self :: Trait { constness_span : Some ( span) , .. }
59+ Self :: Trait { constness : Const :: Yes ( span) , .. }
6060 | Self :: TraitImpl { constness : Const :: Yes ( span) , .. } => Some ( * span) ,
6161 _ => None ,
6262 }
@@ -110,15 +110,10 @@ impl<'a> AstValidator<'a> {
110110 self . outer_trait_or_trait_impl = old;
111111 }
112112
113- fn with_in_trait (
114- & mut self ,
115- span : Span ,
116- constness_span : Option < Span > ,
117- f : impl FnOnce ( & mut Self ) ,
118- ) {
113+ fn with_in_trait ( & mut self , span : Span , constness : Const , f : impl FnOnce ( & mut Self ) ) {
119114 let old = mem:: replace (
120115 & mut self . outer_trait_or_trait_impl ,
121- Some ( TraitOrTraitImpl :: Trait { span, constness_span } ) ,
116+ Some ( TraitOrTraitImpl :: Trait { span, constness } ) ,
122117 ) ;
123118 f ( self ) ;
124119 self . outer_trait_or_trait_impl = old;
@@ -273,7 +268,7 @@ impl<'a> AstValidator<'a> {
273268 } ;
274269
275270 let make_trait_const_sugg = if const_trait_impl
276- && let TraitOrTraitImpl :: Trait { span, constness_span : None } = parent
271+ && let TraitOrTraitImpl :: Trait { span, constness : ast :: Const :: No } = parent
277272 {
278273 Some ( span. shrink_to_lo ( ) )
279274 } else {
@@ -1131,10 +1126,23 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
11311126 }
11321127 visit:: walk_item ( self , item)
11331128 }
1134- ItemKind :: Trait ( box Trait { is_auto, generics, ident, bounds, items, .. } ) => {
1129+ ItemKind :: Trait ( box Trait {
1130+ constness,
1131+ is_auto,
1132+ generics,
1133+ ident,
1134+ bounds,
1135+ items,
1136+ ..
1137+ } ) => {
11351138 self . visit_attrs_vis_ident ( & item. attrs , & item. vis , ident) ;
1136- let is_const_trait =
1139+ // FIXME(const_trait_impl) remove this
1140+ let alt_const_trait_span =
11371141 attr:: find_by_name ( & item. attrs , sym:: const_trait) . map ( |attr| attr. span ) ;
1142+ let constness = match ( * constness, alt_const_trait_span) {
1143+ ( Const :: Yes ( span) , _) | ( Const :: No , Some ( span) ) => Const :: Yes ( span) ,
1144+ ( Const :: No , None ) => Const :: No ,
1145+ } ;
11381146 if * is_auto == IsAuto :: Yes {
11391147 // Auto traits cannot have generics, super traits nor contain items.
11401148 self . deny_generic_params ( generics, ident. span ) ;
@@ -1145,13 +1153,13 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
11451153
11461154 // Equivalent of `visit::walk_item` for `ItemKind::Trait` that inserts a bound
11471155 // context for the supertraits.
1148- let disallowed =
1149- is_const_trait . is_none ( ) . then ( || TildeConstReason :: Trait { span : item. span } ) ;
1156+ let disallowed = matches ! ( constness , ast :: Const :: No )
1157+ . then ( || TildeConstReason :: Trait { span : item. span } ) ;
11501158 self . with_tilde_const ( disallowed, |this| {
11511159 this. visit_generics ( generics) ;
11521160 walk_list ! ( this, visit_param_bound, bounds, BoundKind :: SuperTraits )
11531161 } ) ;
1154- self . with_in_trait ( item. span , is_const_trait , |this| {
1162+ self . with_in_trait ( item. span , constness , |this| {
11551163 walk_list ! ( this, visit_assoc_item, items, AssocCtxt :: Trait ) ;
11561164 } ) ;
11571165 }
0 commit comments