@@ -434,16 +434,16 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
434
434
435
435
match self . local_names [ local] {
436
436
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 (
439
439
mir:: BindingForm :: ImplicitSelf ( _) ,
440
440
) ) => {
441
441
let ( span, suggestion) =
442
442
suggest_ampmut_self ( self . infcx . tcx , local_decl) ;
443
443
Some ( ( true , span, suggestion) )
444
444
}
445
445
446
- box LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
446
+ LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
447
447
mir:: VarBindingForm {
448
448
binding_mode : ty:: BindingMode :: BindByValue ( _) ,
449
449
opt_ty_info,
@@ -473,20 +473,15 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
473
473
// on for loops, RHS points to the iterator part
474
474
Some ( DesugaringKind :: ForLoop ) => {
475
475
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
485
480
}
486
481
// don't create labels for compiler-generated spans
487
482
Some ( _) => None ,
488
483
None => {
489
- let ( span , suggestion ) = if name != kw:: SelfLower {
484
+ let label = if name != kw:: SelfLower {
490
485
suggest_ampmut (
491
486
self . infcx . tcx ,
492
487
local_decl,
@@ -501,7 +496,11 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
501
496
..
502
497
} ) ,
503
498
) ) ) => {
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)
505
504
}
506
505
// explicit self (eg `self: &'a Self`)
507
506
_ => suggest_ampmut (
@@ -512,12 +511,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
512
511
) ,
513
512
}
514
513
} ;
515
- Some ( ( true , span , suggestion ) )
514
+ Some ( label )
516
515
}
517
516
}
518
517
}
519
518
520
- box LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
519
+ LocalInfo :: User ( ClearCrossCrate :: Set ( mir:: BindingForm :: Var (
521
520
mir:: VarBindingForm {
522
521
binding_mode : ty:: BindingMode :: BindByReference ( _) ,
523
522
..
@@ -528,7 +527,7 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
528
527
. map ( |replacement| ( true , pattern_span, replacement) )
529
528
}
530
529
531
- box LocalInfo :: User ( ClearCrossCrate :: Clear ) => {
530
+ LocalInfo :: User ( ClearCrossCrate :: Clear ) => {
532
531
bug ! ( "saw cleared local state" )
533
532
}
534
533
@@ -559,7 +558,12 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
559
558
}
560
559
}
561
560
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
+ ) ;
563
567
}
564
568
None => { }
565
569
}
@@ -1004,7 +1008,7 @@ fn suggest_ampmut<'tcx>(
1004
1008
local_decl : & mir:: LocalDecl < ' tcx > ,
1005
1009
opt_assignment_rhs_span : Option < Span > ,
1006
1010
opt_ty_info : Option < Span > ,
1007
- ) -> ( Span , String ) {
1011
+ ) -> ( bool , Span , String ) {
1008
1012
if let Some ( assignment_rhs_span) = opt_assignment_rhs_span
1009
1013
&& let Ok ( src) = tcx. sess . source_map ( ) . span_to_snippet ( assignment_rhs_span)
1010
1014
{
@@ -1028,37 +1032,38 @@ fn suggest_ampmut<'tcx>(
1028
1032
let lt_name = & src[ 1 ..ws_pos] ;
1029
1033
let ty = src[ ws_pos..] . trim_start ( ) ;
1030
1034
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}" ) ) ;
1032
1036
}
1033
1037
} else if let Some ( stripped) = src. strip_prefix ( '&' ) {
1034
1038
let stripped = stripped. trim_start ( ) ;
1035
1039
if !is_mutbl ( stripped) {
1036
- return ( assignment_rhs_span, format ! ( "&mut {stripped}" ) ) ;
1040
+ return ( true , assignment_rhs_span, format ! ( "&mut {stripped}" ) ) ;
1037
1041
}
1038
1042
}
1039
1043
}
1040
1044
1041
- let highlight_span = match opt_ty_info {
1045
+ let ( suggestability , highlight_span) = match opt_ty_info {
1042
1046
// if this is a variable binding with an explicit type,
1043
1047
// try to highlight that for the suggestion.
1044
- Some ( ty_span) => ty_span,
1048
+ Some ( ty_span) => ( true , ty_span) ,
1045
1049
1046
1050
// otherwise, just highlight the span associated with
1047
1051
// the (MIR) LocalDecl.
1048
- None => local_decl. source_info . span ,
1052
+ None => ( false , local_decl. source_info . span ) ,
1049
1053
} ;
1050
1054
1051
1055
if let Ok ( src) = tcx. sess . source_map ( ) . span_to_snippet ( highlight_span)
1052
1056
&& let ( true , Some ( ws_pos) ) = ( src. starts_with ( "&'" ) , src. find ( char:: is_whitespace) )
1053
1057
{
1054
1058
let lt_name = & src[ 1 ..ws_pos] ;
1055
1059
let ty = & src[ ws_pos..] ;
1056
- return ( highlight_span, format ! ( "&{} mut{}" , lt_name, ty) ) ;
1060
+ return ( true , highlight_span, format ! ( "&{} mut{}" , lt_name, ty) ) ;
1057
1061
}
1058
1062
1059
1063
let ty_mut = local_decl. ty . builtin_deref ( true ) . unwrap ( ) ;
1060
1064
assert_eq ! ( ty_mut. mutbl, hir:: Mutability :: Not ) ;
1061
1065
(
1066
+ suggestability,
1062
1067
highlight_span,
1063
1068
if local_decl. ty . is_region_ptr ( ) {
1064
1069
format ! ( "&mut {}" , ty_mut. ty)
0 commit comments