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