@@ -192,6 +192,14 @@ impl<'a> AsMut<Resolver<'a>> for BuildReducedGraphVisitor<'a, '_> {
192
192
193
193
impl < ' a , ' b > BuildReducedGraphVisitor < ' a , ' b > {
194
194
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 {
195
203
let parent_scope = & self . parent_scope ;
196
204
match vis. node {
197
205
ast:: VisibilityKind :: Public => ty:: Visibility :: Public ,
@@ -239,13 +247,15 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
239
247
& segments,
240
248
Some ( TypeNS ) ,
241
249
parent_scope,
242
- true ,
250
+ !speculative ,
243
251
path. span ,
244
252
CrateLint :: SimplePath ( id) ,
245
253
) {
246
254
PathResult :: Module ( ModuleOrUniformRoot :: Module ( module) ) => {
247
255
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
+ }
249
259
if module. is_normal ( ) {
250
260
if res == Res :: Err {
251
261
ty:: Visibility :: Public
@@ -747,7 +757,7 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
747
757
// NOTE: The field may be an expansion placeholder, but expansion sets correct
748
758
// visibilities for unnamed field placeholders specifically, so the constructor
749
759
// 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 ) ;
751
761
if ctor_vis. is_at_least ( field_vis, & * self . r ) {
752
762
ctor_vis = field_vis;
753
763
}
@@ -774,7 +784,6 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
774
784
775
785
// Record field names for error reporting.
776
786
let field_names = vdata. fields ( ) . iter ( ) . map ( |field| {
777
- self . resolve_visibility ( & field. vis ) ;
778
787
respan ( field. span , field. ident . map_or ( kw:: Invalid , |ident| ident. name ) )
779
788
} ) . collect ( ) ;
780
789
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> {
1281
1290
if sf. is_placeholder {
1282
1291
self . visit_invoc ( sf. id ) ;
1283
1292
} else {
1293
+ self . resolve_visibility ( & sf. vis ) ;
1284
1294
visit:: walk_struct_field ( self , sf) ;
1285
1295
}
1286
1296
}
0 commit comments