@@ -5,7 +5,7 @@ use crate::session_diagnostics::{
55    CaptureVarKind ,  CaptureVarPathUseCause ,  OnClosureNote , 
66} ; 
77use  itertools:: Itertools ; 
8- use  rustc_errors:: { Applicability ,  DiagnosticBuilder } ; 
8+ use  rustc_errors:: { Applicability ,  DiagnosticArgValue ,   DiagnosticBuilder ,   IntoDiagnosticArg } ; 
99use  rustc_hir as  hir; 
1010use  rustc_hir:: def:: { CtorKind ,  Namespace } ; 
1111use  rustc_hir:: CoroutineKind ; 
@@ -48,7 +48,7 @@ mod region_errors;
4848
4949pub ( crate )  use  bound_region_errors:: { ToUniverseInfo ,  UniverseInfo } ; 
5050pub ( crate )  use  move_errors:: { IllegalMoveOriginKind ,  MoveError } ; 
51- pub ( crate )  use  mutability_errors:: AccessKind ; 
51+ pub ( crate )  use  mutability_errors:: { AccessKind ,   PlaceAndReason } ; 
5252pub ( crate )  use  outlives_suggestion:: OutlivesSuggestionBuilder ; 
5353pub ( crate )  use  region_errors:: { ErrorConstraintInfo ,  RegionErrorKind ,  RegionErrors } ; 
5454pub ( crate )  use  region_name:: { RegionName ,  RegionNameSource } ; 
@@ -64,6 +64,18 @@ pub(super) struct DescribePlaceOpt {
6464
6565pub ( super )  struct  IncludingTupleField ( pub ( super )  bool ) ; 
6666
67+ #[ derive( Debug ) ]  
68+ pub ( super )  struct  DescribedPlace ( pub ( super )  Option < String > ) ; 
69+ 
70+ impl  IntoDiagnosticArg  for  DescribedPlace  { 
71+     fn  into_diagnostic_arg ( self )  -> DiagnosticArgValue  { 
72+         match  self . 0  { 
73+             Some ( descr)  => descr. into_diagnostic_arg ( ) , 
74+             None  => "value" . into_diagnostic_arg ( ) , 
75+         } 
76+     } 
77+ } 
78+ 
6779impl < ' cx ,  ' tcx >  MirBorrowckCtxt < ' cx ,  ' tcx >  { 
6880    /// Adds a suggestion when a closure is invoked twice with a moved variable or when a closure 
6981     /// is moved after being invoked. 
@@ -175,6 +187,10 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
175187        } 
176188    } 
177189
190+     pub ( super )  fn  describe_place_typed ( & self ,  place_ref :  PlaceRef < ' tcx > )  -> DescribedPlace  { 
191+         DescribedPlace ( self . describe_place ( place_ref) ) 
192+     } 
193+ 
178194    /// End-user visible description of `place` if one can be found. 
179195     /// If the place is a temporary for instance, `None` will be returned. 
180196     pub ( super )  fn  describe_place ( & self ,  place_ref :  PlaceRef < ' tcx > )  -> Option < String >  { 
@@ -699,6 +715,7 @@ impl UseSpans<'_> {
699715    } 
700716} 
701717
718+ #[ derive( Clone ,  Copy ,  Debug ) ]  
702719pub ( super )  enum  BorrowedContentSource < ' tcx >  { 
703720    DerefRawPointer , 
704721    DerefMutableRef , 
@@ -750,7 +767,7 @@ impl<'tcx> BorrowedContentSource<'tcx> {
750767                    _ => None , 
751768                } ) 
752769                . unwrap_or_else ( || format ! ( "dereference of `{ty}`" ) ) , 
753-             BorrowedContentSource :: OverloadedIndex ( ty)  => format ! ( "an index of  `{ty}`" ) , 
770+             BorrowedContentSource :: OverloadedIndex ( ty)  => format ! ( "`{ty}`" ) , 
754771        } 
755772    } 
756773
0 commit comments