@@ -1348,33 +1348,36 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
13481348 span : Span ,
13491349 remaining_fields : FxHashMap < Ident , ( usize , & ty:: FieldDef ) > ,
13501350 ) {
1351- let tcx = self . tcx ;
13521351 let len = remaining_fields. len ( ) ;
13531352
13541353 let mut displayable_field_names =
13551354 remaining_fields. keys ( ) . map ( |ident| ident. as_str ( ) ) . collect :: < Vec < _ > > ( ) ;
13561355
13571356 displayable_field_names. sort ( ) ;
13581357
1359- let truncated_fields_error = if len <= 3 {
1360- String :: new ( )
1361- } else {
1362- format ! ( " and {} other field{}" , ( len - 3 ) , if len - 3 == 1 { "" } else { "s" } )
1358+ let mut truncated_fields_error = String :: new ( ) ;
1359+ let remaining_fields_names = match & displayable_field_names[ ..] {
1360+ [ field1] => format ! ( "`{}`" , field1) ,
1361+ [ field1, field2] => format ! ( "`{}` and `{}`" , field1, field2) ,
1362+ [ field1, field2, field3] => format ! ( "`{}`, `{}` and `{}`" , field1, field2, field3) ,
1363+ _ => {
1364+ truncated_fields_error =
1365+ format ! ( " and {} other field{}" , len - 3 , pluralize!( len - 3 ) ) ;
1366+ displayable_field_names
1367+ . iter ( )
1368+ . take ( 3 )
1369+ . map ( |n| format ! ( "`{}`" , n) )
1370+ . collect :: < Vec < _ > > ( )
1371+ . join ( ", " )
1372+ }
13631373 } ;
13641374
1365- let remaining_fields_names = displayable_field_names
1366- . iter ( )
1367- . take ( 3 )
1368- . map ( |n| format ! ( "`{}`" , n) )
1369- . collect :: < Vec < _ > > ( )
1370- . join ( ", " ) ;
1371-
13721375 struct_span_err ! (
1373- tcx. sess,
1376+ self . tcx. sess,
13741377 span,
13751378 E0063 ,
13761379 "missing field{} {}{} in initializer of `{}`" ,
1377- pluralize!( remaining_fields . len( ) ) ,
1380+ pluralize!( len) ,
13781381 remaining_fields_names,
13791382 truncated_fields_error,
13801383 adt_ty
0 commit comments