@@ -1041,12 +1041,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10411041 vec ! [ ( left, "(" . to_string( ) ) , ( right. shrink_to_hi( ) , ")" . to_string( ) ) ] ,
10421042 Applicability :: MachineApplicable ,
10431043 ) ;
1044- } else if fields. len ( ) > subpats. len ( ) {
1045- let after_fields_span = if pat_span == DUMMY_SP {
1046- pat_span
1047- } else {
1048- pat_span. with_hi ( pat_span. hi ( ) - BytePos ( 1 ) ) . shrink_to_hi ( )
1049- } ;
1044+ } else if fields. len ( ) > subpats. len ( ) && pat_span != DUMMY_SP {
1045+ let after_fields_span = pat_span. with_hi ( pat_span. hi ( ) - BytePos ( 1 ) ) . shrink_to_hi ( ) ;
10501046 let all_fields_span = match subpats {
10511047 [ ] => after_fields_span,
10521048 [ field] => field. span ,
@@ -1055,7 +1051,19 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10551051
10561052 // Check if all the fields in the pattern are wildcards.
10571053 let all_wildcards = subpats. iter ( ) . all ( |pat| matches ! ( pat. kind, PatKind :: Wild ) ) ;
1054+ let first_tail_wildcard =
1055+ subpats. iter ( ) . enumerate ( ) . fold ( None , |acc, ( pos, pat) | match ( acc, & pat. kind ) {
1056+ ( None , PatKind :: Wild ) => Some ( pos) ,
1057+ ( Some ( _) , PatKind :: Wild ) => acc,
1058+ _ => None ,
1059+ } ) ;
1060+ let tail_span = match first_tail_wildcard {
1061+ None => after_fields_span,
1062+ Some ( 0 ) => subpats[ 0 ] . span . to ( after_fields_span) ,
1063+ Some ( pos) => subpats[ pos - 1 ] . span . shrink_to_hi ( ) . to ( after_fields_span) ,
1064+ } ;
10581065
1066+ // FIXME: heuristic-based suggestion to check current types for where to add `_`.
10591067 let mut wildcard_sugg = vec ! [ "_" ; fields. len( ) - subpats. len( ) ] . join ( ", " ) ;
10601068 if !subpats. is_empty ( ) {
10611069 wildcard_sugg = String :: from ( ", " ) + & wildcard_sugg;
@@ -1080,7 +1088,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10801088 ) ;
10811089 } else {
10821090 err. span_suggestion_verbose (
1083- after_fields_span ,
1091+ tail_span ,
10841092 "use `..` to ignore the rest of the fields" ,
10851093 String :: from ( ", .." ) ,
10861094 Applicability :: MaybeIncorrect ,
0 commit comments