@@ -434,16 +434,16 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
434434
435435 match self . local_names [ local] {
436436 Some ( name) if !local_decl. from_compiler_desugaring ( ) => {
437- let label = match local_decl. local_info . as_ref ( ) . unwrap ( ) {
438- box LocalInfo :: User ( ClearCrossCrate :: Set (
437+ let label = match local_decl. local_info . as_deref ( ) . unwrap ( ) {
438+ LocalInfo :: User ( ClearCrossCrate :: Set (
439439 mir:: BindingForm :: ImplicitSelf ( _) ,
440440 ) ) => {
441441 let ( span, suggestion) =
442442 suggest_ampmut_self ( self . infcx . tcx , local_decl) ;
443443 Some ( ( true , span, suggestion) )
444444 }
445445
446- box LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
446+ LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
447447 mir:: VarBindingForm {
448448 binding_mode : ty:: BindingMode :: BindByValue ( _) ,
449449 opt_ty_info,
@@ -473,20 +473,15 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
473473 // on for loops, RHS points to the iterator part
474474 Some ( DesugaringKind :: ForLoop ) => {
475475 self . suggest_similar_mut_method_for_for_loop ( & mut err) ;
476- Some ( (
477- false ,
478- opt_assignment_rhs_span. unwrap ( ) ,
479- format ! (
480- "this iterator yields `{SIGIL}` {DESC}s" ,
481- SIGIL = pointer_sigil,
482- DESC = pointer_desc
483- ) ,
484- ) )
476+ err. span_label ( opt_assignment_rhs_span. unwrap ( ) , format ! (
477+ "this iterator yields `{pointer_sigil}` {pointer_desc}s" ,
478+ ) ) ;
479+ None
485480 }
486481 // don't create labels for compiler-generated spans
487482 Some ( _) => None ,
488483 None => {
489- let ( span , suggestion ) = if name != kw:: SelfLower {
484+ let label = if name != kw:: SelfLower {
490485 suggest_ampmut (
491486 self . infcx . tcx ,
492487 local_decl,
@@ -501,7 +496,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
501496 ..
502497 } ) ,
503498 ) ) ) => {
504- suggest_ampmut_self ( self . infcx . tcx , local_decl)
499+ let ( span, sugg) = suggest_ampmut_self (
500+ self . infcx . tcx ,
501+ local_decl,
502+ ) ;
503+ ( true , span, sugg)
505504 }
506505 // explicit self (eg `self: &'a Self`)
507506 _ => suggest_ampmut (
@@ -512,12 +511,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
512511 ) ,
513512 }
514513 } ;
515- Some ( ( true , span , suggestion ) )
514+ Some ( label )
516515 }
517516 }
518517 }
519518
520- box LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
519+ LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
521520 mir:: VarBindingForm {
522521 binding_mode : ty:: BindingMode :: BindByReference ( _) ,
523522 ..
@@ -528,7 +527,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
528527 . map ( |replacement| ( true , pattern_span, replacement) )
529528 }
530529
531- box LocalInfo :: User ( ClearCrossCrate :: Clear ) => {
530+ LocalInfo :: User ( ClearCrossCrate :: Clear ) => {
532531 bug ! ( "saw cleared local state" )
533532 }
534533
@@ -559,7 +558,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
559558 }
560559 }
561560 Some ( ( false , err_label_span, message) ) => {
562- err. span_label ( err_label_span, & message) ;
561+ err. span_label (
562+ err_label_span,
563+ & format ! (
564+ "consider changing this binding's type to be: `{message}`"
565+ ) ,
566+ ) ;
563567 }
564568 None => { }
565569 }
@@ -1004,7 +1008,7 @@ fn suggest_ampmut<'tcx>(
10041008 local_decl : & mir:: LocalDecl < ' tcx > ,
10051009 opt_assignment_rhs_span : Option < Span > ,
10061010 opt_ty_info : Option < Span > ,
1007- ) -> ( Span , String ) {
1011+ ) -> ( bool , Span , String ) {
10081012 if let Some ( assignment_rhs_span) = opt_assignment_rhs_span
10091013 && let Ok ( src) = tcx. sess . source_map ( ) . span_to_snippet ( assignment_rhs_span)
10101014 {
@@ -1028,37 +1032,38 @@ fn suggest_ampmut<'tcx>(
10281032 let lt_name = & src[ 1 ..ws_pos] ;
10291033 let ty = src[ ws_pos..] . trim_start ( ) ;
10301034 if !is_mutbl ( ty) {
1031- return ( assignment_rhs_span, format ! ( "&{lt_name} mut {ty}" ) ) ;
1035+ return ( true , assignment_rhs_span, format ! ( "&{lt_name} mut {ty}" ) ) ;
10321036 }
10331037 } else if let Some ( stripped) = src. strip_prefix ( '&' ) {
10341038 let stripped = stripped. trim_start ( ) ;
10351039 if !is_mutbl ( stripped) {
1036- return ( assignment_rhs_span, format ! ( "&mut {stripped}" ) ) ;
1040+ return ( true , assignment_rhs_span, format ! ( "&mut {stripped}" ) ) ;
10371041 }
10381042 }
10391043 }
10401044
1041- let highlight_span = match opt_ty_info {
1045+ let ( suggestability , highlight_span) = match opt_ty_info {
10421046 // if this is a variable binding with an explicit type,
10431047 // try to highlight that for the suggestion.
1044- Some ( ty_span) => ty_span,
1048+ Some ( ty_span) => ( true , ty_span) ,
10451049
10461050 // otherwise, just highlight the span associated with
10471051 // the (MIR) LocalDecl.
1048- None => local_decl. source_info . span ,
1052+ None => ( false , local_decl. source_info . span ) ,
10491053 } ;
10501054
10511055 if let Ok ( src) = tcx. sess . source_map ( ) . span_to_snippet ( highlight_span)
10521056 && let ( true , Some ( ws_pos) ) = ( src. starts_with ( "&'" ) , src. find ( char:: is_whitespace) )
10531057 {
10541058 let lt_name = & src[ 1 ..ws_pos] ;
10551059 let ty = & src[ ws_pos..] ;
1056- return ( highlight_span, format ! ( "&{} mut{}" , lt_name, ty) ) ;
1060+ return ( true , highlight_span, format ! ( "&{} mut{}" , lt_name, ty) ) ;
10571061 }
10581062
10591063 let ty_mut = local_decl. ty . builtin_deref ( true ) . unwrap ( ) ;
10601064 assert_eq ! ( ty_mut. mutbl, hir:: Mutability :: Not ) ;
10611065 (
1066+ suggestability,
10621067 highlight_span,
10631068 if local_decl. ty . is_region_ptr ( ) {
10641069 format ! ( "&mut {}" , ty_mut. ty)
0 commit comments