@@ -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) => {
@@ -845,11 +836,9 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
845836
846837 this. visit_vis ( & item. vis ) ;
847838 this. visit_ident ( item. ident ) ;
848- if let Const :: Yes ( _) = constness {
849- this. with_tilde_const_allowed ( |this| this. visit_generics ( generics) ) ;
850- } else {
851- this. visit_generics ( generics) ;
852- }
839+ let disallowed = matches ! ( constness, Const :: No )
840+ . then ( || DisallowTildeConstContext :: Impl ( item. span ) ) ;
841+ this. with_tilde_const ( disallowed, |this| this. visit_generics ( generics) ) ;
853842 this. visit_trait_ref ( t) ;
854843 this. visit_ty ( self_ty) ;
855844
@@ -863,10 +852,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
863852 polarity,
864853 defaultness,
865854 constness,
866- generics : _ ,
855+ generics,
867856 of_trait : None ,
868857 self_ty,
869- items : _ ,
858+ items,
870859 } ) => {
871860 let error =
872861 |annotation_span, annotation, only_trait : bool | errors:: InherentImplCannot {
@@ -898,6 +887,14 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
898887 if let & Const :: Yes ( span) = constness {
899888 self . err_handler ( ) . emit_err ( error ( span, "`const`" , true ) ) ;
900889 }
890+
891+ self . visit_vis ( & item. vis ) ;
892+ self . visit_ident ( item. ident ) ;
893+ self . with_tilde_const ( None , |this| this. visit_generics ( generics) ) ;
894+ self . visit_ty ( self_ty) ;
895+ walk_list ! ( self , visit_assoc_item, items, AssocCtxt :: Impl ) ;
896+ walk_list ! ( self , visit_attribute, & item. attrs) ;
897+ return ; // Avoid visiting again.
901898 }
902899 ItemKind :: Fn ( box Fn { defaultness, sig, generics, body } ) => {
903900 self . check_defaultness ( item. span , * defaultness) ;
@@ -978,8 +975,10 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
978975 // context for the supertraits.
979976 this. visit_vis ( & item. vis ) ;
980977 this. visit_ident ( item. ident ) ;
981- this. visit_generics ( generics) ;
982- this. with_tilde_const_allowed ( |this| {
978+ let disallowed =
979+ ( !is_const_trait) . then ( || DisallowTildeConstContext :: Trait ( item. span ) ) ;
980+ this. with_tilde_const ( disallowed, |this| {
981+ this. visit_generics ( generics) ;
983982 walk_list ! ( this, visit_param_bound, bounds, BoundKind :: SuperTraits )
984983 } ) ;
985984 walk_list ! ( this, visit_assoc_item, items, AssocCtxt :: Trait ) ;
@@ -999,16 +998,11 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
999998 }
1000999 }
10011000 ItemKind :: Struct ( vdata, generics) => match vdata {
1002- // Duplicating the `Visitor` logic allows catching all cases
1003- // of `Anonymous(Struct, Union)` outside of a field struct or union.
1004- //
1005- // Inside `visit_ty` the validator catches every `Anonymous(Struct, Union)` it
1006- // encounters, and only on `ItemKind::Struct` and `ItemKind::Union`
1007- // it uses `visit_ty_common`, which doesn't contain that specific check.
10081001 VariantData :: Struct ( fields, ..) => {
10091002 self . visit_vis ( & item. vis ) ;
10101003 self . visit_ident ( item. ident ) ;
10111004 self . visit_generics ( generics) ;
1005+ // Permit `Anon{Struct,Union}` as field type.
10121006 walk_list ! ( self , visit_struct_field_def, fields) ;
10131007 walk_list ! ( self , visit_attribute, & item. attrs) ;
10141008 return ;
@@ -1024,6 +1018,7 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
10241018 self . visit_vis ( & item. vis ) ;
10251019 self . visit_ident ( item. ident ) ;
10261020 self . visit_generics ( generics) ;
1021+ // Permit `Anon{Struct,Union}` as field type.
10271022 walk_list ! ( self , visit_struct_field_def, fields) ;
10281023 walk_list ! ( self , visit_attribute, & item. attrs) ;
10291024 return ;
@@ -1212,15 +1207,18 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
12121207 if let Some ( reason) = & self . disallow_tilde_const =>
12131208 {
12141209 let reason = match reason {
1215- DisallowTildeConstContext :: TraitObject => {
1216- errors:: TildeConstReason :: TraitObject
1217- }
12181210 DisallowTildeConstContext :: Fn ( FnKind :: Closure ( ..) ) => {
12191211 errors:: TildeConstReason :: Closure
12201212 }
12211213 DisallowTildeConstContext :: Fn ( FnKind :: Fn ( _, ident, ..) ) => {
12221214 errors:: TildeConstReason :: Function { ident : ident. span }
12231215 }
1216+ & DisallowTildeConstContext :: Trait ( span) => errors:: TildeConstReason :: Trait { span } ,
1217+ & DisallowTildeConstContext :: Impl ( span) => errors:: TildeConstReason :: Impl { span } ,
1218+ DisallowTildeConstContext :: TraitObject => {
1219+ errors:: TildeConstReason :: TraitObject
1220+ }
1221+ DisallowTildeConstContext :: Item => errors:: TildeConstReason :: Item ,
12241222 } ;
12251223 self . err_handler ( )
12261224 . emit_err ( errors:: TildeConstDisallowed { span : bound. span ( ) , reason } ) ;
@@ -1328,7 +1326,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
13281326 || matches ! ( fk. ctxt( ) , Some ( FnCtxt :: Assoc ( _) ) if self . in_const_trait_or_impl) ;
13291327
13301328 let disallowed = ( !tilde_const_allowed) . then ( || DisallowTildeConstContext :: Fn ( fk) ) ;
1331-
13321329 self . with_tilde_const ( disallowed, |this| visit:: walk_fn ( this, fk) ) ;
13331330 }
13341331
@@ -1397,18 +1394,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
13971394 }
13981395
13991396 match & item. kind {
1400- AssocItemKind :: Type ( box TyAlias { generics, bounds, ty, .. } )
1401- if ctxt == AssocCtxt :: Trait =>
1402- {
1403- self . visit_vis ( & item. vis ) ;
1404- self . visit_ident ( item. ident ) ;
1405- walk_list ! ( self , visit_attribute, & item. attrs) ;
1406- self . with_tilde_const_allowed ( |this| {
1407- this. visit_generics ( generics) ;
1408- walk_list ! ( this, visit_param_bound, bounds, BoundKind :: Bound ) ;
1409- } ) ;
1410- walk_list ! ( self , visit_ty, ty) ;
1411- }
14121397 AssocItemKind :: Fn ( box Fn { sig, generics, body, .. } )
14131398 if self . in_const_trait_or_impl
14141399 || ctxt == AssocCtxt :: Trait
@@ -1552,7 +1537,7 @@ pub fn check_crate(
15521537 in_const_trait_or_impl : false ,
15531538 has_proc_macro_decls : false ,
15541539 outer_impl_trait : None ,
1555- disallow_tilde_const : None ,
1540+ disallow_tilde_const : Some ( DisallowTildeConstContext :: Item ) ,
15561541 is_impl_trait_banned : false ,
15571542 lint_buffer : lints,
15581543 } ;
0 commit comments