@@ -27,14 +27,31 @@ use rustc_span::Span;
2727/// employing the ExprUseVisitor. 
2828pub  trait  Delegate < ' tcx >  { 
2929 // The value found at `place` is either copied or moved, depending 
30-  // on mode. 
31-  fn  consume ( & mut  self ,  place_with_id :  & PlaceWithHirId < ' tcx > ,  mode :  ConsumeMode ) ; 
30+  // on `mode`. Where `diag_expr_id` is the id used for diagnostics for `place`. 
31+  // 
32+  // The parameter `diag_expr_id` indicates the HIR id that ought to be used for 
33+  // diagnostics. Around pattern matching such as `let pat = expr`, the diagnostic 
34+  // id will be the id of the expression `expr` but the place itself will have 
35+  // the id of the binding in the pattern `pat`. 
36+  fn  consume ( 
37+  & mut  self , 
38+  place_with_id :  & PlaceWithHirId < ' tcx > , 
39+  diag_expr_id :  hir:: HirId , 
40+  mode :  ConsumeMode , 
41+  ) ; 
3242
3343 // The value found at `place` is being borrowed with kind `bk`. 
34-  fn  borrow ( & mut  self ,  place_with_id :  & PlaceWithHirId < ' tcx > ,  bk :  ty:: BorrowKind ) ; 
35- 
36-  // The path at `place_with_id` is being assigned to. 
37-  fn  mutate ( & mut  self ,  assignee_place :  & PlaceWithHirId < ' tcx > ) ; 
44+  // `diag_expr_id` is the id used for diagnostics (see `consume` for more details). 
45+  fn  borrow ( 
46+  & mut  self , 
47+  place_with_id :  & PlaceWithHirId < ' tcx > , 
48+  diag_expr_id :  hir:: HirId , 
49+  bk :  ty:: BorrowKind , 
50+  ) ; 
51+ 
52+  // The path at `assignee_place` is being assigned to. 
53+  // `diag_expr_id` is the id used for diagnostics (see `consume` for more details). 
54+  fn  mutate ( & mut  self ,  assignee_place :  & PlaceWithHirId < ' tcx > ,  diag_expr_id :  hir:: HirId ) ; 
3855} 
3956
4057#[ derive( Copy ,  Clone ,  PartialEq ,  Debug ) ]  
@@ -116,11 +133,11 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
116133 self . mc . tcx ( ) 
117134 } 
118135
119-  fn  delegate_consume ( & mut  self ,  place_with_id :  & PlaceWithHirId < ' tcx > )  { 
136+  fn  delegate_consume ( & mut  self ,  place_with_id :  & PlaceWithHirId < ' tcx > ,   diag_expr_id :  hir :: HirId )  { 
120137 debug ! ( "delegate_consume(place_with_id={:?})" ,  place_with_id) ; 
121138
122139 let  mode = copy_or_move ( & self . mc ,  place_with_id) ; 
123-  self . delegate . consume ( place_with_id,  mode) ; 
140+  self . delegate . consume ( place_with_id,  diag_expr_id ,   mode) ; 
124141 } 
125142
126143 fn  consume_exprs ( & mut  self ,  exprs :  & [ hir:: Expr < ' _ > ] )  { 
@@ -133,21 +150,21 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
133150 debug ! ( "consume_expr(expr={:?})" ,  expr) ; 
134151
135152 let  place_with_id = return_if_err ! ( self . mc. cat_expr( expr) ) ; 
136-  self . delegate_consume ( & place_with_id) ; 
153+  self . delegate_consume ( & place_with_id,  place_with_id . hir_id ) ; 
137154 self . walk_expr ( expr) ; 
138155 } 
139156
140157 fn  mutate_expr ( & mut  self ,  expr :  & hir:: Expr < ' _ > )  { 
141158 let  place_with_id = return_if_err ! ( self . mc. cat_expr( expr) ) ; 
142-  self . delegate . mutate ( & place_with_id) ; 
159+  self . delegate . mutate ( & place_with_id,  place_with_id . hir_id ) ; 
143160 self . walk_expr ( expr) ; 
144161 } 
145162
146163 fn  borrow_expr ( & mut  self ,  expr :  & hir:: Expr < ' _ > ,  bk :  ty:: BorrowKind )  { 
147164 debug ! ( "borrow_expr(expr={:?}, bk={:?})" ,  expr,  bk) ; 
148165
149166 let  place_with_id = return_if_err ! ( self . mc. cat_expr( expr) ) ; 
150-  self . delegate . borrow ( & place_with_id,  bk) ; 
167+  self . delegate . borrow ( & place_with_id,  place_with_id . hir_id ,   bk) ; 
151168
152169 self . walk_expr ( expr) 
153170 } 
@@ -404,7 +421,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
404421 with_field. ty ( self . tcx ( ) ,  substs) , 
405422 ProjectionKind :: Field ( f_index as  u32 ,  VariantIdx :: new ( 0 ) ) , 
406423 ) ; 
407-  self . delegate_consume ( & field_place) ; 
424+  self . delegate_consume ( & field_place,  field_place . hir_id ) ; 
408425 } 
409426 } 
410427 } 
@@ -436,7 +453,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
436453 adjustment:: Adjust :: NeverToAny  | adjustment:: Adjust :: Pointer ( _)  => { 
437454 // Creating a closure/fn-pointer or unsizing consumes 
438455 // the input and stores it into the resulting rvalue. 
439-  self . delegate_consume ( & place_with_id) ; 
456+  self . delegate_consume ( & place_with_id,  place_with_id . hir_id ) ; 
440457 } 
441458
442459 adjustment:: Adjust :: Deref ( None )  => { } 
@@ -448,7 +465,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
448465 // this is an autoref of `x`. 
449466 adjustment:: Adjust :: Deref ( Some ( ref  deref) )  => { 
450467 let  bk = ty:: BorrowKind :: from_mutbl ( deref. mutbl ) ; 
451-  self . delegate . borrow ( & place_with_id,  bk) ; 
468+  self . delegate . borrow ( & place_with_id,  place_with_id . hir_id ,   bk) ; 
452469 } 
453470
454471 adjustment:: Adjust :: Borrow ( ref  autoref)  => { 
@@ -476,13 +493,17 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
476493
477494 match  * autoref { 
478495 adjustment:: AutoBorrow :: Ref ( _,  m)  => { 
479-  self . delegate . borrow ( base_place,  ty:: BorrowKind :: from_mutbl ( m. into ( ) ) ) ; 
496+  self . delegate . borrow ( 
497+  base_place, 
498+  base_place. hir_id , 
499+  ty:: BorrowKind :: from_mutbl ( m. into ( ) ) , 
500+  ) ; 
480501 } 
481502
482503 adjustment:: AutoBorrow :: RawPtr ( m)  => { 
483504 debug ! ( "walk_autoref: expr.hir_id={} base_place={:?}" ,  expr. hir_id,  base_place) ; 
484505
485-  self . delegate . borrow ( base_place,  ty:: BorrowKind :: from_mutbl ( m) ) ; 
506+  self . delegate . borrow ( base_place,  base_place . hir_id ,   ty:: BorrowKind :: from_mutbl ( m) ) ; 
486507 } 
487508 } 
488509 } 
@@ -525,19 +546,22 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
525546 // binding being produced. 
526547 let  def = Res :: Local ( canonical_id) ; 
527548 if  let  Ok ( ref binding_place)  = mc. cat_res( pat. hir_id,  pat. span,  pat_ty,  def)  { 
528-  delegate. mutate( binding_place) ; 
549+  delegate. mutate( binding_place,  binding_place . hir_id ) ; 
529550 } 
530551
531552 // It is also a borrow or copy/move of the value being matched. 
553+  // In a cases of pattern like `let pat = upvar`, don't use the span 
554+  // of the pattern, as this just looks confusing, instead use the span 
555+  // of the discriminant. 
532556 match  bm { 
533557 ty:: BindByReference ( m)  => { 
534558 let  bk = ty:: BorrowKind :: from_mutbl( m) ; 
535-  delegate. borrow( place,  bk) ; 
559+  delegate. borrow( place,  discr_place . hir_id ,   bk) ; 
536560 } 
537561 ty:: BindByValue ( ..)  => { 
538-  let  mode = copy_or_move( mc,  place) ; 
562+  let  mode = copy_or_move( mc,  & place) ; 
539563 debug!( "walk_pat binding consuming pat" ) ; 
540-  delegate. consume( place,  mode) ; 
564+  delegate. consume( place,  discr_place . hir_id ,   mode) ; 
541565 } 
542566 } 
543567 } 
@@ -564,10 +588,14 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> {
564588 match  upvar_capture { 
565589 ty:: UpvarCapture :: ByValue ( _)  => { 
566590 let  mode = copy_or_move ( & self . mc ,  & captured_place) ; 
567-  self . delegate . consume ( & captured_place,  mode) ; 
591+  self . delegate . consume ( & captured_place,  captured_place . hir_id ,   mode) ; 
568592 } 
569593 ty:: UpvarCapture :: ByRef ( upvar_borrow)  => { 
570-  self . delegate . borrow ( & captured_place,  upvar_borrow. kind ) ; 
594+  self . delegate . borrow ( 
595+  & captured_place, 
596+  captured_place. hir_id , 
597+  upvar_borrow. kind , 
598+  ) ; 
571599 } 
572600 } 
573601 } 
0 commit comments