@@ -49,14 +49,14 @@ enum SelfSemantic {
49
49
}
50
50
51
51
enum TraitOrTraitImpl {
52
- Trait { span : Span , constness_span : Option < Span > } ,
52
+ Trait { span : Span , constness : Const } ,
53
53
TraitImpl { constness : Const , polarity : ImplPolarity , trait_ref_span : Span } ,
54
54
}
55
55
56
56
impl TraitOrTraitImpl {
57
57
fn constness ( & self ) -> Option < Span > {
58
58
match self {
59
- Self :: Trait { constness_span : Some ( span) , .. }
59
+ Self :: Trait { constness : Const :: Yes ( span) , .. }
60
60
| Self :: TraitImpl { constness : Const :: Yes ( span) , .. } => Some ( * span) ,
61
61
_ => None ,
62
62
}
@@ -110,15 +110,10 @@ impl<'a> AstValidator<'a> {
110
110
self . outer_trait_or_trait_impl = old;
111
111
}
112
112
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 ) ) {
119
114
let old = mem:: replace (
120
115
& mut self . outer_trait_or_trait_impl ,
121
- Some ( TraitOrTraitImpl :: Trait { span, constness_span } ) ,
116
+ Some ( TraitOrTraitImpl :: Trait { span, constness } ) ,
122
117
) ;
123
118
f ( self ) ;
124
119
self . outer_trait_or_trait_impl = old;
@@ -273,7 +268,7 @@ impl<'a> AstValidator<'a> {
273
268
} ;
274
269
275
270
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
277
272
{
278
273
Some ( span. shrink_to_lo ( ) )
279
274
} else {
@@ -1131,10 +1126,23 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1131
1126
}
1132
1127
visit:: walk_item ( self , item)
1133
1128
}
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
+ } ) => {
1135
1138
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 =
1137
1141
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
+ } ;
1138
1146
if * is_auto == IsAuto :: Yes {
1139
1147
// Auto traits cannot have generics, super traits nor contain items.
1140
1148
self . deny_generic_params ( generics, ident. span ) ;
@@ -1145,13 +1153,13 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1145
1153
1146
1154
// Equivalent of `visit::walk_item` for `ItemKind::Trait` that inserts a bound
1147
1155
// 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 } ) ;
1150
1158
self . with_tilde_const ( disallowed, |this| {
1151
1159
this. visit_generics ( generics) ;
1152
1160
walk_list ! ( this, visit_param_bound, bounds, BoundKind :: SuperTraits )
1153
1161
} ) ;
1154
- self . with_in_trait ( item. span , is_const_trait , |this| {
1162
+ self . with_in_trait ( item. span , constness , |this| {
1155
1163
walk_list ! ( this, visit_assoc_item, items, AssocCtxt :: Trait ) ;
1156
1164
} ) ;
1157
1165
}
0 commit comments