@@ -1258,7 +1258,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1258
1258
self . field_ty ( span, f, substs)
1259
1259
} )
1260
1260
. unwrap_or_else ( || {
1261
- inexistent_fields. push ( field. ident ) ;
1261
+ inexistent_fields. push ( field) ;
1262
1262
no_field_errors = false ;
1263
1263
tcx. ty_error ( )
1264
1264
} )
@@ -1276,13 +1276,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1276
1276
. collect :: < Vec < _ > > ( ) ;
1277
1277
1278
1278
let inexistent_fields_err = if !( inexistent_fields. is_empty ( ) || variant. is_recovered ( ) )
1279
- && !inexistent_fields. iter ( ) . any ( |field| field. name == kw:: Underscore )
1279
+ && !inexistent_fields. iter ( ) . any ( |field| field. ident . name == kw:: Underscore )
1280
1280
{
1281
1281
Some ( self . error_inexistent_fields (
1282
1282
adt. variant_descr ( ) ,
1283
1283
& inexistent_fields,
1284
1284
& mut unmentioned_fields,
1285
1285
variant,
1286
+ substs,
1286
1287
) )
1287
1288
} else {
1288
1289
None
@@ -1448,28 +1449,29 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1448
1449
fn error_inexistent_fields (
1449
1450
& self ,
1450
1451
kind_name : & str ,
1451
- inexistent_fields : & [ Ident ] ,
1452
- unmentioned_fields : & mut Vec < ( & ty:: FieldDef , Ident ) > ,
1452
+ inexistent_fields : & [ & hir :: PatField < ' tcx > ] ,
1453
+ unmentioned_fields : & mut Vec < ( & ' tcx ty:: FieldDef , Ident ) > ,
1453
1454
variant : & ty:: VariantDef ,
1455
+ substs : & ' tcx ty:: List < ty:: subst:: GenericArg < ' tcx > > ,
1454
1456
) -> DiagnosticBuilder < ' tcx , ErrorGuaranteed > {
1455
1457
let tcx = self . tcx ;
1456
1458
let ( field_names, t, plural) = if inexistent_fields. len ( ) == 1 {
1457
- ( format ! ( "a field named `{}`" , inexistent_fields[ 0 ] ) , "this" , "" )
1459
+ ( format ! ( "a field named `{}`" , inexistent_fields[ 0 ] . ident ) , "this" , "" )
1458
1460
} else {
1459
1461
(
1460
1462
format ! (
1461
1463
"fields named {}" ,
1462
1464
inexistent_fields
1463
1465
. iter( )
1464
- . map( |ident | format!( "`{}`" , ident) )
1466
+ . map( |field | format!( "`{}`" , field . ident) )
1465
1467
. collect:: <Vec <String >>( )
1466
1468
. join( ", " )
1467
1469
) ,
1468
1470
"these" ,
1469
1471
"s" ,
1470
1472
)
1471
1473
} ;
1472
- let spans = inexistent_fields. iter ( ) . map ( |ident| ident. span ) . collect :: < Vec < _ > > ( ) ;
1474
+ let spans = inexistent_fields. iter ( ) . map ( |field| field . ident . span ) . collect :: < Vec < _ > > ( ) ;
1473
1475
let mut err = struct_span_err ! (
1474
1476
tcx. sess,
1475
1477
spans,
@@ -1479,9 +1481,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1479
1481
tcx. def_path_str( variant. def_id) ,
1480
1482
field_names
1481
1483
) ;
1482
- if let Some ( ident ) = inexistent_fields. last ( ) {
1484
+ if let Some ( pat_field ) = inexistent_fields. last ( ) {
1483
1485
err. span_label (
1484
- ident. span ,
1486
+ pat_field . ident . span ,
1485
1487
format ! (
1486
1488
"{} `{}` does not have {} field{}" ,
1487
1489
kind_name,
@@ -1494,10 +1496,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1494
1496
if unmentioned_fields. len ( ) == 1 {
1495
1497
let input =
1496
1498
unmentioned_fields. iter ( ) . map ( |( _, field) | field. name ) . collect :: < Vec < _ > > ( ) ;
1497
- let suggested_name = find_best_match_for_name ( & input, ident. name , None ) ;
1499
+ let suggested_name = find_best_match_for_name ( & input, pat_field . ident . name , None ) ;
1498
1500
if let Some ( suggested_name) = suggested_name {
1499
1501
err. span_suggestion (
1500
- ident. span ,
1502
+ pat_field . ident . span ,
1501
1503
"a field with a similar name exists" ,
1502
1504
suggested_name. to_string ( ) ,
1503
1505
Applicability :: MaybeIncorrect ,
@@ -1513,17 +1515,30 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
1513
1515
unmentioned_fields. retain ( |& ( _, x) | x. name != suggested_name) ;
1514
1516
}
1515
1517
} else if inexistent_fields. len ( ) == 1 {
1516
- let unmentioned_field = unmentioned_fields[ 0 ] . 1 . name ;
1517
- err. span_suggestion_short (
1518
- ident. span ,
1519
- & format ! (
1520
- "`{}` has a field named `{}`" ,
1521
- tcx. def_path_str( variant. def_id) ,
1522
- unmentioned_field
1523
- ) ,
1524
- unmentioned_field. to_string ( ) ,
1525
- Applicability :: MaybeIncorrect ,
1526
- ) ;
1518
+ match pat_field. pat . kind {
1519
+ PatKind :: Lit ( expr)
1520
+ if !self . can_coerce (
1521
+ self . typeck_results . borrow ( ) . expr_ty ( expr) ,
1522
+ self . field_ty (
1523
+ unmentioned_fields[ 0 ] . 1 . span ,
1524
+ unmentioned_fields[ 0 ] . 0 ,
1525
+ substs,
1526
+ ) ,
1527
+ ) => { }
1528
+ _ => {
1529
+ let unmentioned_field = unmentioned_fields[ 0 ] . 1 . name ;
1530
+ err. span_suggestion_short (
1531
+ pat_field. ident . span ,
1532
+ & format ! (
1533
+ "`{}` has a field named `{}`" ,
1534
+ tcx. def_path_str( variant. def_id) ,
1535
+ unmentioned_field
1536
+ ) ,
1537
+ unmentioned_field. to_string ( ) ,
1538
+ Applicability :: MaybeIncorrect ,
1539
+ ) ;
1540
+ }
1541
+ }
1527
1542
}
1528
1543
}
1529
1544
}
0 commit comments