@@ -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