@@ -117,7 +117,7 @@ use std::io;
117
117
use std:: rc:: Rc ;
118
118
use syntax:: ast:: { self , NodeId } ;
119
119
use syntax:: symbol:: keywords;
120
- use syntax_pos:: Span ;
120
+ use syntax_pos:: { Span , MultiSpan } ;
121
121
122
122
use hir:: Expr ;
123
123
use hir;
@@ -1363,8 +1363,8 @@ impl<'a, 'tcx> Visitor<'tcx> for Liveness<'a, 'tcx> {
1363
1363
1364
1364
fn check_local < ' a , ' tcx > ( this : & mut Liveness < ' a , ' tcx > , local : & ' tcx hir:: Local ) {
1365
1365
match local. init {
1366
- Some ( _ ) => {
1367
- this. warn_about_unused_or_dead_vars_in_pat ( & local. pat ) ;
1366
+ Some ( ref init_expr ) => {
1367
+ this. warn_about_unused_or_dead_vars_in_pat ( & local. pat , init_expr . span ) ;
1368
1368
} ,
1369
1369
None => {
1370
1370
this. pat_bindings ( & local. pat , |this, ln, var, sp, id| {
@@ -1388,19 +1388,21 @@ fn check_arm<'a, 'tcx>(this: &mut Liveness<'a, 'tcx>, arm: &'tcx hir::Arm) {
1388
1388
1389
1389
fn check_expr < ' a , ' tcx > ( this : & mut Liveness < ' a , ' tcx > , expr : & ' tcx Expr ) {
1390
1390
match expr. node {
1391
- hir:: ExprAssign ( ref l, _) => {
1392
- this. check_place ( & l) ;
1391
+ hir:: ExprAssign ( ref l, ref r) => {
1392
+ let msp = MultiSpan :: from_spans ( vec ! [ l. span, r. span] ) ;
1393
+ this. check_place ( & l, msp) ;
1393
1394
1394
- intravisit:: walk_expr ( this, expr) ;
1395
- }
1396
-
1397
- hir:: ExprAssignOp ( _, ref l, _) => {
1398
- if !this. tables . is_method_call ( expr) {
1399
- this. check_place ( & l) ;
1395
+ intravisit:: walk_expr ( this, expr) ;
1400
1396
}
1401
1397
1402
- intravisit:: walk_expr ( this, expr) ;
1403
- }
1398
+ hir:: ExprAssignOp ( _, ref l, ref r) => {
1399
+ if !this. tables . is_method_call ( expr) {
1400
+ let msp = MultiSpan :: from_spans ( vec ! [ l. span, r. span] ) ;
1401
+ this. check_place ( & l, msp) ;
1402
+ }
1403
+
1404
+ intravisit:: walk_expr ( this, expr) ;
1405
+ }
1404
1406
1405
1407
hir:: ExprInlineAsm ( ref ia, ref outputs, ref inputs) => {
1406
1408
for input in inputs {
@@ -1410,7 +1412,7 @@ fn check_expr<'a, 'tcx>(this: &mut Liveness<'a, 'tcx>, expr: &'tcx Expr) {
1410
1412
// Output operands must be places
1411
1413
for ( o, output) in ia. outputs . iter ( ) . zip ( outputs) {
1412
1414
if !o. is_indirect {
1413
- this. check_place ( output) ;
1415
+ this. check_place ( output, MultiSpan :: from_span ( output . span ) ) ;
1414
1416
}
1415
1417
this. visit_expr ( output) ;
1416
1418
}
@@ -1435,7 +1437,7 @@ fn check_expr<'a, 'tcx>(this: &mut Liveness<'a, 'tcx>, expr: &'tcx Expr) {
1435
1437
}
1436
1438
1437
1439
impl < ' a , ' tcx > Liveness < ' a , ' tcx > {
1438
- fn check_place ( & mut self , expr : & ' tcx Expr ) {
1440
+ fn check_place ( & mut self , expr : & ' tcx Expr , msp : MultiSpan ) {
1439
1441
match expr. node {
1440
1442
hir:: ExprPath ( hir:: QPath :: Resolved ( _, ref path) ) => {
1441
1443
if let Def :: Local ( nid) = path. def {
@@ -1445,7 +1447,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
1445
1447
// as being used.
1446
1448
let ln = self . live_node ( expr. id , expr. span ) ;
1447
1449
let var = self . variable ( nid, expr. span ) ;
1448
- self . warn_about_dead_assign ( expr . span , expr. id , ln, var) ;
1450
+ self . warn_about_dead_assign ( msp , expr. id , ln, var) ;
1449
1451
}
1450
1452
}
1451
1453
_ => {
@@ -1482,10 +1484,11 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
1482
1484
}
1483
1485
}
1484
1486
1485
- fn warn_about_unused_or_dead_vars_in_pat ( & mut self , pat : & hir:: Pat ) {
1487
+ fn warn_about_unused_or_dead_vars_in_pat ( & mut self , pat : & hir:: Pat , assign_span : Span ) {
1486
1488
self . pat_bindings ( pat, |this, ln, var, sp, id| {
1487
1489
if !this. warn_about_unused ( sp, id, ln, var) {
1488
- this. warn_about_dead_assign ( sp, id, ln, var) ;
1490
+ let msp = MultiSpan :: from_spans ( vec ! [ sp, assign_span] ) ;
1491
+ this. warn_about_dead_assign ( msp, id, ln, var) ;
1489
1492
}
1490
1493
} )
1491
1494
}
@@ -1538,16 +1541,17 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
1538
1541
}
1539
1542
1540
1543
fn warn_about_dead_assign ( & self ,
1541
- sp : Span ,
1544
+ msp : MultiSpan ,
1542
1545
id : NodeId ,
1543
1546
ln : LiveNode ,
1544
1547
var : Variable ) {
1545
1548
if self . live_on_exit ( ln, var) . is_none ( ) {
1546
- self . report_dead_assign ( id, sp , var, false ) ;
1549
+ self . report_dead_assign ( id, msp , var, false ) ;
1547
1550
}
1548
1551
}
1549
1552
1550
- fn report_dead_assign ( & self , id : NodeId , sp : Span , var : Variable , is_argument : bool ) {
1553
+ fn report_dead_assign < S : Into < MultiSpan > > ( & self , id : NodeId , sp : S ,
1554
+ var : Variable , is_argument : bool ) {
1551
1555
if let Some ( name) = self . should_warn ( var) {
1552
1556
if is_argument {
1553
1557
self . ir . tcx . lint_node ( lint:: builtin:: UNUSED_ASSIGNMENTS , id, sp,
0 commit comments