@@ -1176,6 +1176,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
11761176 let mut no_field_errors = true ;
11771177
11781178 let mut inexistent_fields = vec ! [ ] ;
1179+ let mut invisible_fields = vec ! [ ] ;
11791180 // Typecheck each field.
11801181 for field in fields {
11811182 let span = field. span ;
@@ -1191,6 +1192,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
11911192 field_map
11921193 . get ( & ident)
11931194 . 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+ }
11941201 self . write_field_index ( field. hir_id , * i) ;
11951202 self . tcx . check_stability ( f. did , Some ( pat. hir_id ) , span) ;
11961203 self . field_ty ( span, f, substs)
@@ -1281,6 +1288,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
12811288 self . error_tuple_variant_index_shorthand ( variant, pat, fields)
12821289 {
12831290 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 ( ) ;
12841298 }
12851299 }
12861300 }
@@ -1359,6 +1373,41 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
13591373 . emit ( ) ;
13601374 }
13611375
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+
13621411 fn error_inexistent_fields (
13631412 & self ,
13641413 kind_name : & str ,
0 commit comments