@@ -1139,10 +1139,9 @@ impl<'a, 'tcx, 'v> Visitor<'v> for SanePrivacyVisitor<'a, 'tcx> {
1139
1139
}
1140
1140
1141
1141
impl < ' a , ' tcx > SanePrivacyVisitor < ' a , ' tcx > {
1142
- /// Validates all of the visibility qualifiers placed on the item given. This
1143
- /// ensures that there are no extraneous qualifiers that don't actually do
1144
- /// anything. In theory these qualifiers wouldn't parse, but that may happen
1145
- /// later on down the road...
1142
+ /// Validate that items that shouldn't have visibility qualifiers don't have them.
1143
+ /// Such qualifiers can be set by syntax extensions even if the parser doesn't allow them,
1144
+ /// so we check things like variant fields too.
1146
1145
fn check_sane_privacy ( & self , item : & hir:: Item ) {
1147
1146
let check_inherited = |sp, vis, note : & str | {
1148
1147
if vis != hir:: Inherited {
@@ -1156,13 +1155,12 @@ impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
1156
1155
} ;
1157
1156
1158
1157
match item. node {
1159
- // implementations of traits don't need visibility qualifiers because
1160
- // that's controlled by having the trait in scope.
1161
1158
hir:: ItemImpl ( _, _, _, Some ( ..) , _, ref impl_items) => {
1162
1159
check_inherited ( item. span , item. vis ,
1163
1160
"visibility qualifiers have no effect on trait impls" ) ;
1164
1161
for impl_item in impl_items {
1165
- check_inherited ( impl_item. span , impl_item. vis , "" ) ;
1162
+ check_inherited ( impl_item. span , impl_item. vis ,
1163
+ "visibility qualifiers have no effect on trait impl items" ) ;
1166
1164
}
1167
1165
}
1168
1166
hir:: ItemImpl ( _, _, _, None , _, _) => {
@@ -1177,7 +1175,15 @@ impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
1177
1175
check_inherited ( item. span , item. vis ,
1178
1176
"place qualifiers on individual functions instead" ) ;
1179
1177
}
1180
- hir:: ItemStruct ( ..) | hir:: ItemEnum ( ..) | hir:: ItemTrait ( ..) |
1178
+ hir:: ItemEnum ( ref def, _) => {
1179
+ for variant in & def. variants {
1180
+ for field in variant. node . data . fields ( ) {
1181
+ check_inherited ( field. span , field. node . kind . visibility ( ) ,
1182
+ "visibility qualifiers have no effect on variant fields" ) ;
1183
+ }
1184
+ }
1185
+ }
1186
+ hir:: ItemStruct ( ..) | hir:: ItemTrait ( ..) |
1181
1187
hir:: ItemConst ( ..) | hir:: ItemStatic ( ..) | hir:: ItemFn ( ..) |
1182
1188
hir:: ItemMod ( ..) | hir:: ItemExternCrate ( ..) |
1183
1189
hir:: ItemUse ( ..) | hir:: ItemTy ( ..) => { }
@@ -1764,8 +1770,7 @@ pub fn check_crate(tcx: &ty::ctxt,
1764
1770
1765
1771
let krate = tcx. map . krate ( ) ;
1766
1772
1767
- // Sanity check to make sure that all privacy usage and controls are
1768
- // reasonable.
1773
+ // Sanity check to make sure that all privacy usage is reasonable.
1769
1774
let mut visitor = SanePrivacyVisitor { tcx : tcx } ;
1770
1775
krate. visit_all_items ( & mut visitor) ;
1771
1776
0 commit comments