@@ -194,6 +194,14 @@ impl<'a> AsMut<Resolver<'a>> for BuildReducedGraphVisitor<'a, '_> {
194
194
195
195
impl < ' a , ' b > BuildReducedGraphVisitor < ' a , ' b > {
196
196
fn resolve_visibility ( & mut self , vis : & ast:: Visibility ) -> ty:: Visibility {
197
+ self . resolve_visibility_speculative ( vis, false )
198
+ }
199
+
200
+ fn resolve_visibility_speculative (
201
+ & mut self ,
202
+ vis : & ast:: Visibility ,
203
+ speculative : bool ,
204
+ ) -> ty:: Visibility {
197
205
let parent_scope = & self . parent_scope ;
198
206
match vis. node {
199
207
ast:: VisibilityKind :: Public => ty:: Visibility :: Public ,
@@ -241,13 +249,15 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
241
249
& segments,
242
250
Some ( TypeNS ) ,
243
251
parent_scope,
244
- true ,
252
+ !speculative ,
245
253
path. span ,
246
254
CrateLint :: SimplePath ( id) ,
247
255
) {
248
256
PathResult :: Module ( ModuleOrUniformRoot :: Module ( module) ) => {
249
257
let res = module. res ( ) . expect ( "visibility resolved to unnamed block" ) ;
250
- self . r . record_partial_res ( id, PartialRes :: new ( res) ) ;
258
+ if !speculative {
259
+ self . r . record_partial_res ( id, PartialRes :: new ( res) ) ;
260
+ }
251
261
if module. is_normal ( ) {
252
262
if res == Res :: Err {
253
263
ty:: Visibility :: Public
@@ -742,7 +752,10 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
742
752
743
753
// Record field names for error reporting.
744
754
let field_names = struct_def. fields ( ) . iter ( ) . map ( |field| {
745
- let field_vis = self . resolve_visibility ( & field. vis ) ;
755
+ // NOTE: The field may be an expansion placeholder, but expansion sets correct
756
+ // visibilities for unnamed field placeholders specifically, so the constructor
757
+ // visibility should still be determined correctly.
758
+ let field_vis = self . resolve_visibility_speculative ( & field. vis , true ) ;
746
759
if ctor_vis. is_at_least ( field_vis, & * self . r ) {
747
760
ctor_vis = field_vis;
748
761
}
@@ -769,7 +782,6 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
769
782
770
783
// Record field names for error reporting.
771
784
let field_names = vdata. fields ( ) . iter ( ) . map ( |field| {
772
- self . resolve_visibility ( & field. vis ) ;
773
785
respan ( field. span , field. ident . map_or ( kw:: Invalid , |ident| ident. name ) )
774
786
} ) . collect ( ) ;
775
787
let item_def_id = self . r . definitions . local_def_id ( item. id ) ;
@@ -1279,6 +1291,7 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
1279
1291
if sf. is_placeholder {
1280
1292
self . visit_invoc ( sf. id ) ;
1281
1293
} else {
1294
+ self . resolve_visibility ( & sf. vis ) ;
1282
1295
visit:: walk_struct_field ( self , sf) ;
1283
1296
}
1284
1297
}
0 commit comments