@@ -40,6 +40,9 @@ enum SelfSemantic {
4040enum DisallowTildeConstContext < ' a > {
4141 TraitObject ,
4242 Fn ( FnKind < ' a > ) ,
43+ Trait ( Span ) ,
44+ Impl ( Span ) ,
45+ Item ,
4346}
4447
4548struct AstValidator < ' a > {
@@ -110,18 +113,6 @@ impl<'a> AstValidator<'a> {
110113 self . disallow_tilde_const = old;
111114 }
112115
113- fn with_tilde_const_allowed ( & mut self , f : impl FnOnce ( & mut Self ) ) {
114- self . with_tilde_const ( None , f)
115- }
116-
117- fn with_banned_tilde_const (
118- & mut self ,
119- ctx : DisallowTildeConstContext < ' a > ,
120- f : impl FnOnce ( & mut Self ) ,
121- ) {
122- self . with_tilde_const ( Some ( ctx) , f)
123- }
124-
125116 fn check_type_alias_where_clause_location (
126117 & mut self ,
127118 ty_alias : & TyAlias ,
@@ -173,7 +164,7 @@ impl<'a> AstValidator<'a> {
173164 self . with_impl_trait ( Some ( t. span ) , |this| visit:: walk_ty ( this, t) )
174165 }
175166 TyKind :: TraitObject ( ..) => self
176- . with_banned_tilde_const ( DisallowTildeConstContext :: TraitObject , |this| {
167+ . with_tilde_const ( Some ( DisallowTildeConstContext :: TraitObject ) , |this| {
177168 visit:: walk_ty ( this, t)
178169 } ) ,
179170 TyKind :: Path ( qself, path) => {
@@ -822,11 +813,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
822813
823814 this. visit_vis ( & item. vis ) ;
824815 this. visit_ident ( item. ident ) ;
825- if let Const :: Yes ( _) = constness {
826- this. with_tilde_const_allowed ( |this| this. visit_generics ( generics) ) ;
827- } else {
828- this. visit_generics ( generics) ;
829- }
816+ let disallowed = matches ! ( constness, Const :: No )
817+ . then ( || DisallowTildeConstContext :: Impl ( item. span ) ) ;
818+ this. with_tilde_const ( disallowed, |this| this. visit_generics ( generics) ) ;
830819 this. visit_trait_ref ( t) ;
831820 this. visit_ty ( self_ty) ;
832821
@@ -840,10 +829,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
840829 polarity,
841830 defaultness,
842831 constness,
843- generics : _ ,
832+ generics,
844833 of_trait : None ,
845834 self_ty,
846- items : _ ,
835+ items,
847836 } ) => {
848837 let error =
849838 |annotation_span, annotation, only_trait : bool | errors:: InherentImplCannot {
@@ -875,6 +864,14 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
875864 if let & Const :: Yes ( span) = constness {
876865 self . err_handler ( ) . emit_err ( error ( span, "`const`" , true ) ) ;
877866 }
867+
868+ self . visit_vis ( & item. vis ) ;
869+ self . visit_ident ( item. ident ) ;
870+ self . with_tilde_const ( None , |this| this. visit_generics ( generics) ) ;
871+ self . visit_ty ( self_ty) ;
872+ walk_list ! ( self , visit_assoc_item, items, AssocCtxt :: Impl ) ;
873+ walk_list ! ( self , visit_attribute, & item. attrs) ;
874+ return ; // Avoid visiting again.
878875 }
879876 ItemKind :: Fn ( box Fn { defaultness, sig, generics, body } ) => {
880877 self . check_defaultness ( item. span , * defaultness) ;
@@ -955,8 +952,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
955952 // context for the supertraits.
956953 this. visit_vis ( & item. vis ) ;
957954 this. visit_ident ( item. ident ) ;
958- this. visit_generics ( generics) ;
959- this. with_tilde_const_allowed ( |this| {
955+ let disallowed =
956+ ( !is_const_trait) . then ( || DisallowTildeConstContext :: Trait ( item. span ) ) ;
957+ this. with_tilde_const ( disallowed, |this| {
958+ this. visit_generics ( generics) ;
960959 walk_list ! ( this, visit_param_bound, bounds, BoundKind :: SuperTraits )
961960 } ) ;
962961 walk_list ! ( this, visit_assoc_item, items, AssocCtxt :: Trait ) ;
@@ -976,16 +975,11 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
976975 }
977976 }
978977 ItemKind :: Struct ( vdata, generics) => match vdata {
979- // Duplicating the `Visitor` logic allows catching all cases
980- // of `Anonymous(Struct, Union)` outside of a field struct or union.
981- //
982- // Inside `visit_ty` the validator catches every `Anonymous(Struct, Union)` it
983- // encounters, and only on `ItemKind::Struct` and `ItemKind::Union`
984- // it uses `visit_ty_common`, which doesn't contain that specific check.
985978 VariantData :: Struct ( fields, ..) => {
986979 self . visit_vis ( & item. vis ) ;
987980 self . visit_ident ( item. ident ) ;
988981 self . visit_generics ( generics) ;
982+ // Permit `Anon{Struct,Union}` as field type.
989983 walk_list ! ( self , visit_struct_field_def, fields) ;
990984 walk_list ! ( self , visit_attribute, & item. attrs) ;
991985 return ;
@@ -1001,6 +995,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
1001995 self . visit_vis ( & item. vis ) ;
1002996 self . visit_ident ( item. ident ) ;
1003997 self . visit_generics ( generics) ;
998+ // Permit `Anon{Struct,Union}` as field type.
1004999 walk_list ! ( self , visit_struct_field_def, fields) ;
10051000 walk_list ! ( self , visit_attribute, & item. attrs) ;
10061001 return ;
@@ -1189,15 +1184,18 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
11891184 if let Some ( reason) = & self . disallow_tilde_const =>
11901185 {
11911186 let reason = match reason {
1192- DisallowTildeConstContext :: TraitObject => {
1193- errors:: TildeConstReason :: TraitObject
1194- }
11951187 DisallowTildeConstContext :: Fn ( FnKind :: Closure ( ..) ) => {
11961188 errors:: TildeConstReason :: Closure
11971189 }
11981190 DisallowTildeConstContext :: Fn ( FnKind :: Fn ( _, ident, ..) ) => {
11991191 errors:: TildeConstReason :: Function { ident : ident. span }
12001192 }
1193+ & DisallowTildeConstContext :: Trait ( span) => errors:: TildeConstReason :: Trait { span } ,
1194+ & DisallowTildeConstContext :: Impl ( span) => errors:: TildeConstReason :: Impl { span } ,
1195+ DisallowTildeConstContext :: TraitObject => {
1196+ errors:: TildeConstReason :: TraitObject
1197+ }
1198+ DisallowTildeConstContext :: Item => errors:: TildeConstReason :: Item ,
12011199 } ;
12021200 self . err_handler ( )
12031201 . emit_err ( errors:: TildeConstDisallowed { span : bound. span ( ) , reason } ) ;
@@ -1305,7 +1303,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
13051303 || matches ! ( fk. ctxt( ) , Some ( FnCtxt :: Assoc ( _) ) if self . in_const_trait_or_impl) ;
13061304
13071305 let disallowed = ( !tilde_const_allowed) . then ( || DisallowTildeConstContext :: Fn ( fk) ) ;
1308-
13091306 self . with_tilde_const ( disallowed, |this| visit:: walk_fn ( this, fk) ) ;
13101307 }
13111308
@@ -1374,18 +1371,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
13741371 }
13751372
13761373 match & item. kind {
1377- AssocItemKind :: Type ( box TyAlias { generics, bounds, ty, .. } )
1378- if ctxt == AssocCtxt :: Trait =>
1379- {
1380- self . visit_vis ( & item. vis ) ;
1381- self . visit_ident ( item. ident ) ;
1382- walk_list ! ( self , visit_attribute, & item. attrs) ;
1383- self . with_tilde_const_allowed ( |this| {
1384- this. visit_generics ( generics) ;
1385- walk_list ! ( this, visit_param_bound, bounds, BoundKind :: Bound ) ;
1386- } ) ;
1387- walk_list ! ( self , visit_ty, ty) ;
1388- }
13891374 AssocItemKind :: Fn ( box Fn { sig, generics, body, .. } )
13901375 if self . in_const_trait_or_impl
13911376 || ctxt == AssocCtxt :: Trait
@@ -1537,7 +1522,7 @@ pub fn check_crate(
15371522 in_const_trait_or_impl : false ,
15381523 has_proc_macro_decls : false ,
15391524 outer_impl_trait : None ,
1540- disallow_tilde_const : None ,
1525+ disallow_tilde_const : Some ( DisallowTildeConstContext :: Item ) ,
15411526 is_impl_trait_banned : false ,
15421527 lint_buffer : lints,
15431528 } ;
0 commit comments