@@ -21,7 +21,7 @@ use rustc_hir as hir;
2121use rustc_hir:: def:: { DefKind , Res } ;
2222use rustc_hir:: def_id:: { DefId , LocalDefId , LocalModDefId , CRATE_DEF_ID } ;
2323use rustc_hir:: intravisit:: { self , Visitor } ;
24- use rustc_hir:: { AssocItemKind , ForeignItemKind , ItemId , PatKind } ;
24+ use rustc_hir:: { AssocItemKind , ForeignItemKind , ItemId , ItemKind , PatKind } ;
2525use rustc_middle:: middle:: privacy:: { EffectiveVisibilities , EffectiveVisibility , Level } ;
2626use rustc_middle:: query:: Providers ;
2727use rustc_middle:: ty:: GenericArgs ;
@@ -98,9 +98,6 @@ trait DefIdVisitor<'tcx> {
9898 fn visit_trait ( & mut self , trait_ref : TraitRef < ' tcx > ) -> ControlFlow < Self :: BreakTy > {
9999 self . skeleton ( ) . visit_trait ( trait_ref)
100100 }
101- fn visit_projection_ty ( & mut self , projection : ty:: AliasTy < ' tcx > ) -> ControlFlow < Self :: BreakTy > {
102- self . skeleton ( ) . visit_projection_ty ( projection)
103- }
104101 fn visit_predicates (
105102 & mut self ,
106103 predicates : ty:: GenericPredicates < ' tcx > ,
@@ -173,6 +170,10 @@ where
173170{
174171 type BreakTy = V :: BreakTy ;
175172
173+ fn visit_predicate ( & mut self , p : ty:: Predicate < ' tcx > ) -> ControlFlow < Self :: BreakTy > {
174+ self . visit_clause ( p. as_clause ( ) . unwrap ( ) )
175+ }
176+
176177 fn visit_ty ( & mut self , ty : Ty < ' tcx > ) -> ControlFlow < V :: BreakTy > {
177178 let tcx = self . def_id_visitor . tcx ( ) ;
178179 // GenericArgs are not visited here because they are visited below
@@ -1076,6 +1077,14 @@ impl<'tcx> TypePrivacyVisitor<'tcx> {
10761077 }
10771078}
10781079
1080+ impl < ' tcx > rustc_ty_utils:: sig_types:: SpannedTypeVisitor < ' tcx > for TypePrivacyVisitor < ' tcx > {
1081+ type BreakTy = ( ) ;
1082+ fn visit ( & mut self , span : Span , value : impl TypeVisitable < TyCtxt < ' tcx > > ) -> ControlFlow < ( ) > {
1083+ self . span = span;
1084+ value. visit_with ( & mut self . skeleton ( ) )
1085+ }
1086+ }
1087+
10791088impl < ' tcx > Visitor < ' tcx > for TypePrivacyVisitor < ' tcx > {
10801089 fn visit_nested_body ( & mut self , body_id : hir:: BodyId ) {
10811090 let old_maybe_typeck_results =
@@ -1086,75 +1095,36 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> {
10861095
10871096 fn visit_ty ( & mut self , hir_ty : & ' tcx hir:: Ty < ' tcx > ) {
10881097 self . span = hir_ty. span ;
1089- if let Some ( typeck_results) = self . maybe_typeck_results {
1090- // Types in bodies.
1091- if self . visit ( typeck_results. node_type ( hir_ty. hir_id ) ) . is_break ( ) {
1092- return ;
1093- }
1094- } else {
1095- // Types in signatures.
1096- // FIXME: This is very ineffective. Ideally each HIR type should be converted
1097- // into a semantic type only once and the result should be cached somehow.
1098- if self . visit ( rustc_hir_analysis:: hir_ty_to_ty ( self . tcx , hir_ty) ) . is_break ( ) {
1099- return ;
1100- }
1098+ if self
1099+ . visit (
1100+ self . maybe_typeck_results
1101+ . unwrap_or_else ( || span_bug ! ( hir_ty. span, "`hir::Ty` outside of a body" ) )
1102+ . node_type ( hir_ty. hir_id ) ,
1103+ )
1104+ . is_break ( )
1105+ {
1106+ return ;
11011107 }
11021108
11031109 intravisit:: walk_ty ( self , hir_ty) ;
11041110 }
11051111
11061112 fn visit_infer ( & mut self , inf : & ' tcx hir:: InferArg ) {
11071113 self . span = inf. span ;
1108- if let Some ( typeck_results ) = self . maybe_typeck_results {
1109- if let Some ( ty ) = typeck_results . node_type_opt ( inf . hir_id ) {
1110- if self . visit ( ty ) . is_break ( ) {
1111- return ;
1112- }
1113- } else {
1114- // FIXME: check types of const infers here.
1114+ if let Some ( ty ) = self
1115+ . maybe_typeck_results
1116+ . unwrap_or_else ( || span_bug ! ( inf . span , "`hir::InferArg` outside of a body" ) )
1117+ . node_type_opt ( inf . hir_id )
1118+ {
1119+ if self . visit ( ty ) . is_break ( ) {
1120+ return ;
11151121 }
11161122 } else {
1117- span_bug ! ( self . span , "`hir::InferArg` outside of a body" ) ;
1123+ // FIXME: check types of const infers here.
11181124 }
11191125 intravisit:: walk_inf ( self , inf) ;
11201126 }
11211127
1122- fn visit_trait_ref ( & mut self , trait_ref : & ' tcx hir:: TraitRef < ' tcx > ) {
1123- self . span = trait_ref. path . span ;
1124- if self . maybe_typeck_results . is_some ( ) {
1125- // Privacy of traits in bodies is checked as a part of trait object types.
1126- } else {
1127- let bounds = rustc_hir_analysis:: hir_trait_to_predicates (
1128- self . tcx ,
1129- trait_ref,
1130- // NOTE: This isn't really right, but the actual type doesn't matter here. It's
1131- // just required by `ty::TraitRef`.
1132- self . tcx . types . never ,
1133- ) ;
1134-
1135- for ( clause, _) in bounds. clauses ( ) {
1136- match clause. kind ( ) . skip_binder ( ) {
1137- ty:: ClauseKind :: Trait ( trait_predicate) => {
1138- if self . visit_trait ( trait_predicate. trait_ref ) . is_break ( ) {
1139- return ;
1140- }
1141- }
1142- ty:: ClauseKind :: Projection ( proj_predicate) => {
1143- let term = self . visit ( proj_predicate. term ) ;
1144- if term. is_break ( )
1145- || self . visit_projection_ty ( proj_predicate. projection_ty ) . is_break ( )
1146- {
1147- return ;
1148- }
1149- }
1150- _ => { }
1151- }
1152- }
1153- }
1154-
1155- intravisit:: walk_trait_ref ( self , trait_ref) ;
1156- }
1157-
11581128 // Check types of expressions
11591129 fn visit_expr ( & mut self , expr : & ' tcx hir:: Expr < ' tcx > ) {
11601130 if self . check_expr_pat_type ( expr. hir_id , expr. span ) {
@@ -1727,7 +1697,26 @@ fn check_mod_privacy(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
17271697 // inferred types of expressions and patterns.
17281698 let span = tcx. def_span ( module_def_id) ;
17291699 let mut visitor = TypePrivacyVisitor { tcx, module_def_id, maybe_typeck_results : None , span } ;
1730- tcx. hir ( ) . visit_item_likes_in_module ( module_def_id, & mut visitor) ;
1700+
1701+ let module = tcx. hir_module_items ( module_def_id) ;
1702+ for def_id in module. definitions ( ) {
1703+ rustc_ty_utils:: sig_types:: walk_types ( tcx, def_id, & mut visitor) ;
1704+
1705+ if let Some ( body_id) = tcx. hir ( ) . maybe_body_owned_by ( def_id) {
1706+ visitor. visit_nested_body ( body_id) ;
1707+ }
1708+ }
1709+
1710+ for id in module. items ( ) {
1711+ if let ItemKind :: Impl ( i) = tcx. hir ( ) . item ( id) . kind {
1712+ if let Some ( item) = i. of_trait {
1713+ let trait_ref = tcx. impl_trait_ref ( id. owner_id . def_id ) . unwrap ( ) ;
1714+ let trait_ref = trait_ref. instantiate_identity ( ) ;
1715+ visitor. span = item. path . span ;
1716+ visitor. visit_def_id ( trait_ref. def_id , "trait" , & trait_ref. print_only_trait_path ( ) ) ;
1717+ }
1718+ }
1719+ }
17311720}
17321721
17331722fn effective_visibilities ( tcx : TyCtxt < ' _ > , ( ) : ( ) ) -> & EffectiveVisibilities {
0 commit comments