@@ -1494,12 +1494,13 @@ impl<'tcx> Liveness<'_, 'tcx> {
14941494        // bindings, and we also consider the first pattern to be the "authoritative" set of ids. 
14951495        // However, we should take the ids and spans of variables with the same name from the later 
14961496        // patterns so the suggestions to prefix with underscores will apply to those too. 
1497-         let  mut  vars:  FxIndexMap < Symbol ,  ( LiveNode ,  Variable ,  Vec < ( HirId ,  Span ) > ) >  = <_ >:: default ( ) ; 
1497+         let  mut  vars:  FxIndexMap < Symbol ,  ( LiveNode ,  Variable ,  Vec < ( HirId ,  Span ,  Span ) > ) >  =
1498+             <_ >:: default ( ) ; 
14981499
14991500        pat. each_binding ( |_,  hir_id,  pat_sp,  ident| { 
15001501            let  ln = entry_ln. unwrap_or_else ( || self . live_node ( hir_id,  pat_sp) ) ; 
15011502            let  var = self . variable ( hir_id,  ident. span ) ; 
1502-             let  id_and_sp = ( hir_id,  pat_sp) ; 
1503+             let  id_and_sp = ( hir_id,  pat_sp,  ident . span ) ; 
15031504            vars. entry ( self . ir . variable_name ( var) ) 
15041505                . and_modify ( |( ..,  hir_ids_and_spans) | hir_ids_and_spans. push ( id_and_sp) ) 
15051506                . or_insert_with ( || ( ln,  var,  vec ! [ id_and_sp] ) ) ; 
@@ -1508,15 +1509,21 @@ impl<'tcx> Liveness<'_, 'tcx> {
15081509        for  ( _,  ( ln,  var,  hir_ids_and_spans) )  in  vars { 
15091510            if  self . used_on_entry ( ln,  var)  { 
15101511                let  id = hir_ids_and_spans[ 0 ] . 0 ; 
1511-                 let  spans = hir_ids_and_spans. into_iter ( ) . map ( |( _,  sp) | sp) . collect ( ) ; 
1512+                 let  spans =
1513+                     hir_ids_and_spans. into_iter ( ) . map ( |( _,  _,  ident_span) | ident_span) . collect ( ) ; 
15121514                on_used_on_entry ( spans,  id,  ln,  var) ; 
15131515            }  else  { 
15141516                self . report_unused ( hir_ids_and_spans,  ln,  var) ; 
15151517            } 
15161518        } 
15171519    } 
15181520
1519-     fn  report_unused ( & self ,  hir_ids_and_spans :  Vec < ( HirId ,  Span ) > ,  ln :  LiveNode ,  var :  Variable )  { 
1521+     fn  report_unused ( 
1522+         & self , 
1523+         hir_ids_and_spans :  Vec < ( HirId ,  Span ,  Span ) > , 
1524+         ln :  LiveNode , 
1525+         var :  Variable , 
1526+     )  { 
15201527        let  first_hir_id = hir_ids_and_spans[ 0 ] . 0 ; 
15211528
15221529        if  let  Some ( name)  = self . should_warn ( var) . filter ( |name| name != "self" )  { 
@@ -1530,62 +1537,78 @@ impl<'tcx> Liveness<'_, 'tcx> {
15301537                self . ir . tcx . struct_span_lint_hir ( 
15311538                    lint:: builtin:: UNUSED_VARIABLES , 
15321539                    first_hir_id, 
1533-                     hir_ids_and_spans. into_iter ( ) . map ( |( _,  sp) | sp) . collect :: < Vec < _ > > ( ) , 
1540+                     hir_ids_and_spans
1541+                         . into_iter ( ) 
1542+                         . map ( |( _,  _,  ident_span) | ident_span) 
1543+                         . collect :: < Vec < _ > > ( ) , 
15341544                    |lint| { 
15351545                        lint. build ( & format ! ( "variable `{}` is assigned to, but never used" ,  name) ) 
15361546                            . note ( & format ! ( "consider using `_{}` instead" ,  name) ) 
15371547                            . emit ( ) ; 
15381548                    } , 
15391549                ) 
15401550            }  else  { 
1541-                 self . ir . tcx . struct_span_lint_hir ( 
1542-                     lint:: builtin:: UNUSED_VARIABLES , 
1543-                     first_hir_id, 
1544-                     hir_ids_and_spans. iter ( ) . map ( |( _,  sp) | * sp) . collect :: < Vec < _ > > ( ) , 
1545-                     |lint| { 
1546-                         let  mut  err = lint. build ( & format ! ( "unused variable: `{}`" ,  name) ) ; 
1547- 
1548-                         let  ( shorthands,  non_shorthands) :  ( Vec < _ > ,  Vec < _ > )  =
1549-                             hir_ids_and_spans. into_iter ( ) . partition ( |( hir_id,  span) | { 
1550-                                 let  var = self . variable ( * hir_id,  * span) ; 
1551-                                 self . ir . variable_is_shorthand ( var) 
1552-                             } ) ; 
1553- 
1554-                         let  mut  shorthands = shorthands
1555-                             . into_iter ( ) 
1556-                             . map ( |( _,  span) | ( span,  format ! ( "{}: _" ,  name) ) ) 
1557-                             . collect :: < Vec < _ > > ( ) ; 
1558- 
1559-                         // If we have both shorthand and non-shorthand, prefer the "try ignoring 
1560-                         // the field" message, and suggest `_` for the non-shorthands. If we only 
1561-                         // have non-shorthand, then prefix with an underscore instead. 
1562-                         if  !shorthands. is_empty ( )  { 
1563-                             shorthands. extend ( 
1564-                                 non_shorthands
1565-                                     . into_iter ( ) 
1566-                                     . map ( |( _,  span) | ( span,  "_" . to_string ( ) ) ) 
1567-                                     . collect :: < Vec < _ > > ( ) , 
1568-                             ) ; 
1551+                 let  ( shorthands,  non_shorthands) :  ( Vec < _ > ,  Vec < _ > )  =
1552+                     hir_ids_and_spans. iter ( ) . copied ( ) . partition ( |( hir_id,  _,  ident_span) | { 
1553+                         let  var = self . variable ( * hir_id,  * ident_span) ; 
1554+                         self . ir . variable_is_shorthand ( var) 
1555+                     } ) ; 
15691556
1557+                 // If we have both shorthand and non-shorthand, prefer the "try ignoring 
1558+                 // the field" message, and suggest `_` for the non-shorthands. If we only 
1559+                 // have non-shorthand, then prefix with an underscore instead. 
1560+                 if  !shorthands. is_empty ( )  { 
1561+                     let  shorthands = shorthands
1562+                         . into_iter ( ) 
1563+                         . map ( |( _,  pat_span,  _) | ( pat_span,  format ! ( "{}: _" ,  name) ) ) 
1564+                         . chain ( 
1565+                             non_shorthands
1566+                                 . into_iter ( ) 
1567+                                 . map ( |( _,  pat_span,  _) | ( pat_span,  "_" . to_string ( ) ) ) , 
1568+                         ) 
1569+                         . collect :: < Vec < _ > > ( ) ; 
1570+ 
1571+                     self . ir . tcx . struct_span_lint_hir ( 
1572+                         lint:: builtin:: UNUSED_VARIABLES , 
1573+                         first_hir_id, 
1574+                         hir_ids_and_spans
1575+                             . iter ( ) 
1576+                             . map ( |( _,  pat_span,  _) | * pat_span) 
1577+                             . collect :: < Vec < _ > > ( ) , 
1578+                         |lint| { 
1579+                             let  mut  err = lint. build ( & format ! ( "unused variable: `{}`" ,  name) ) ; 
15701580                            err. multipart_suggestion ( 
15711581                                "try ignoring the field" , 
15721582                                shorthands, 
15731583                                Applicability :: MachineApplicable , 
15741584                            ) ; 
1575-                         }  else  { 
1585+                             err. emit ( ) 
1586+                         } , 
1587+                     ) ; 
1588+                 }  else  { 
1589+                     let  non_shorthands = non_shorthands
1590+                         . into_iter ( ) 
1591+                         . map ( |( _,  _,  ident_span) | ( ident_span,  format ! ( "_{}" ,  name) ) ) 
1592+                         . collect :: < Vec < _ > > ( ) ; 
1593+ 
1594+                     self . ir . tcx . struct_span_lint_hir ( 
1595+                         lint:: builtin:: UNUSED_VARIABLES , 
1596+                         first_hir_id, 
1597+                         hir_ids_and_spans
1598+                             . iter ( ) 
1599+                             . map ( |( _,  _,  ident_span) | * ident_span) 
1600+                             . collect :: < Vec < _ > > ( ) , 
1601+                         |lint| { 
1602+                             let  mut  err = lint. build ( & format ! ( "unused variable: `{}`" ,  name) ) ; 
15761603                            err. multipart_suggestion ( 
15771604                                "if this is intentional, prefix it with an underscore" , 
1578-                                 non_shorthands
1579-                                     . into_iter ( ) 
1580-                                     . map ( |( _,  span) | ( span,  format ! ( "_{}" ,  name) ) ) 
1581-                                     . collect :: < Vec < _ > > ( ) , 
1605+                                 non_shorthands, 
15821606                                Applicability :: MachineApplicable , 
15831607                            ) ; 
1584-                         } 
1585- 
1586-                         err. emit ( ) 
1587-                     } , 
1588-                 ) ; 
1608+                             err. emit ( ) 
1609+                         } , 
1610+                     ) ; 
1611+                 } 
15891612            } 
15901613        } 
15911614    } 
0 commit comments