@@ -1176,6 +1176,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1176
1176
let mut no_field_errors = true ;
1177
1177
1178
1178
let mut inexistent_fields = vec ! [ ] ;
1179
+ let mut invisible_fields = vec ! [ ] ;
1179
1180
// Typecheck each field.
1180
1181
for field in fields {
1181
1182
let span = field. span ;
@@ -1191,6 +1192,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1191
1192
field_map
1192
1193
. get ( & ident)
1193
1194
. map ( |( i, f) | {
1195
+ if !f
1196
+ . vis
1197
+ . is_accessible_from ( tcx. parent_module ( pat. hir_id ) . to_def_id ( ) , tcx)
1198
+ {
1199
+ invisible_fields. push ( field. ident ) ;
1200
+ }
1194
1201
self . write_field_index ( field. hir_id , * i) ;
1195
1202
self . tcx . check_stability ( f. did , Some ( pat. hir_id ) , span) ;
1196
1203
self . field_ty ( span, f, substs)
@@ -1281,6 +1288,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1281
1288
self . error_tuple_variant_index_shorthand ( variant, pat, fields)
1282
1289
{
1283
1290
err. emit ( ) ;
1291
+ } else if !invisible_fields. is_empty ( ) {
1292
+ let mut err = self . error_invisible_fields (
1293
+ adt. variant_descr ( ) ,
1294
+ & invisible_fields,
1295
+ variant,
1296
+ ) ;
1297
+ err. emit ( ) ;
1284
1298
}
1285
1299
}
1286
1300
}
@@ -1359,6 +1373,41 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1359
1373
. emit ( ) ;
1360
1374
}
1361
1375
1376
+ fn error_invisible_fields (
1377
+ & self ,
1378
+ kind_name : & str ,
1379
+ invisible_fields : & [ Ident ] ,
1380
+ variant : & ty:: VariantDef ,
1381
+ ) -> DiagnosticBuilder < ' tcx > {
1382
+ let spans = invisible_fields. iter ( ) . map ( |ident| ident. span ) . collect :: < Vec < _ > > ( ) ;
1383
+ let ( field_names, t) = if invisible_fields. len ( ) == 1 {
1384
+ ( format ! ( "a field named `{}`" , invisible_fields[ 0 ] ) , "is" )
1385
+ } else {
1386
+ (
1387
+ format ! (
1388
+ "fields named {}" ,
1389
+ invisible_fields
1390
+ . iter( )
1391
+ . map( |ident| format!( "`{}`" , ident) )
1392
+ . collect:: <Vec <String >>( )
1393
+ . join( ", " )
1394
+ ) ,
1395
+ "are" ,
1396
+ )
1397
+ } ;
1398
+ let err = struct_span_err ! (
1399
+ self . tcx. sess,
1400
+ spans,
1401
+ E0603 ,
1402
+ "cannot match on {} of {} `{}`, which {} not accessible in current scope" ,
1403
+ field_names,
1404
+ kind_name,
1405
+ self . tcx. def_path_str( variant. def_id) ,
1406
+ t
1407
+ ) ;
1408
+ err
1409
+ }
1410
+
1362
1411
fn error_inexistent_fields (
1363
1412
& self ,
1364
1413
kind_name : & str ,
0 commit comments