@@ -192,6 +192,14 @@ impl<'a> AsMut<Resolver<'a>> for BuildReducedGraphVisitor<'a, '_> {
192192
193193impl < ' a , ' b > BuildReducedGraphVisitor < ' a , ' b > {
194194 fn resolve_visibility ( & mut self , vis : & ast:: Visibility ) -> ty:: Visibility {
195+ self . resolve_visibility_speculative ( vis, false )
196+ }
197+
198+ fn resolve_visibility_speculative (
199+ & mut self ,
200+ vis : & ast:: Visibility ,
201+ speculative : bool ,
202+ ) -> ty:: Visibility {
195203 let parent_scope = & self . parent_scope ;
196204 match vis. node {
197205 ast:: VisibilityKind :: Public => ty:: Visibility :: Public ,
@@ -239,13 +247,15 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
239247 & segments,
240248 Some ( TypeNS ) ,
241249 parent_scope,
242- true ,
250+ !speculative ,
243251 path. span ,
244252 CrateLint :: SimplePath ( id) ,
245253 ) {
246254 PathResult :: Module ( ModuleOrUniformRoot :: Module ( module) ) => {
247255 let res = module. res ( ) . expect ( "visibility resolved to unnamed block" ) ;
248- self . r . record_partial_res ( id, PartialRes :: new ( res) ) ;
256+ if !speculative {
257+ self . r . record_partial_res ( id, PartialRes :: new ( res) ) ;
258+ }
249259 if module. is_normal ( ) {
250260 if res == Res :: Err {
251261 ty:: Visibility :: Public
@@ -747,7 +757,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
747757 // NOTE: The field may be an expansion placeholder, but expansion sets correct
748758 // visibilities for unnamed field placeholders specifically, so the constructor
749759 // visibility should still be determined correctly.
750- let field_vis = self . resolve_visibility ( & field. vis ) ;
760+ let field_vis = self . resolve_visibility_speculative ( & field. vis , true ) ;
751761 if ctor_vis. is_at_least ( field_vis, & * self . r ) {
752762 ctor_vis = field_vis;
753763 }
@@ -774,7 +784,6 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
774784
775785 // Record field names for error reporting.
776786 let field_names = vdata. fields ( ) . iter ( ) . map ( |field| {
777- self . resolve_visibility ( & field. vis ) ;
778787 respan ( field. span , field. ident . map_or ( kw:: Invalid , |ident| ident. name ) )
779788 } ) . collect ( ) ;
780789 let item_def_id = self . r . definitions . local_def_id ( item. id ) ;
@@ -1281,6 +1290,7 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
12811290 if sf. is_placeholder {
12821291 self . visit_invoc ( sf. id ) ;
12831292 } else {
1293+ self . resolve_visibility ( & sf. vis ) ;
12841294 visit:: walk_struct_field ( self , sf) ;
12851295 }
12861296 }
0 commit comments