@@ -3775,12 +3775,12 @@ fn hint_missing_borrow<'tcx>(
3775
3775
3776
3776
let args = fn_decl. inputs . iter ( ) . map ( |ty| ty) ;
3777
3777
3778
- fn get_deref_type_and_refs ( mut ty : Ty < ' _ > ) -> ( Ty < ' _ > , usize ) {
3779
- let mut refs = 0 ;
3778
+ fn get_deref_type_and_refs ( mut ty : Ty < ' _ > ) -> ( Ty < ' _ > , Vec < hir :: Mutability > ) {
3779
+ let mut refs = vec ! [ ] ;
3780
3780
3781
- while let ty:: Ref ( _, new_ty, _ ) = ty. kind ( ) {
3781
+ while let ty:: Ref ( _, new_ty, mutbl ) = ty. kind ( ) {
3782
3782
ty = * new_ty;
3783
- refs += 1 ;
3783
+ refs. push ( * mutbl ) ;
3784
3784
}
3785
3785
3786
3786
( ty, refs)
@@ -3794,11 +3794,21 @@ fn hint_missing_borrow<'tcx>(
3794
3794
let ( expected_ty, expected_refs) = get_deref_type_and_refs ( * expected_arg) ;
3795
3795
3796
3796
if infcx. can_eq ( param_env, found_ty, expected_ty) . is_ok ( ) {
3797
- if found_refs < expected_refs {
3798
- to_borrow. push ( ( arg. span . shrink_to_lo ( ) , "&" . repeat ( expected_refs - found_refs) ) ) ;
3799
- } else if found_refs > expected_refs {
3797
+ // FIXME: This could handle more exotic cases like mutability mismatches too!
3798
+ if found_refs. len ( ) < expected_refs. len ( )
3799
+ && found_refs[ ..] == expected_refs[ expected_refs. len ( ) - found_refs. len ( ) ..]
3800
+ {
3801
+ to_borrow. push ( (
3802
+ arg. span . shrink_to_lo ( ) ,
3803
+ expected_refs[ ..expected_refs. len ( ) - found_refs. len ( ) ]
3804
+ . iter ( )
3805
+ . map ( |mutbl| format ! ( "&{}" , mutbl. prefix_str( ) ) )
3806
+ . collect :: < Vec < _ > > ( )
3807
+ . join ( "" ) ,
3808
+ ) ) ;
3809
+ } else if found_refs. len ( ) > expected_refs. len ( ) {
3800
3810
let mut span = arg. span . shrink_to_lo ( ) ;
3801
- let mut left = found_refs - expected_refs;
3811
+ let mut left = found_refs. len ( ) - expected_refs. len ( ) ;
3802
3812
let mut ty = arg;
3803
3813
while let hir:: TyKind :: Ref ( _, mut_ty) = & ty. kind && left > 0 {
3804
3814
span = span. with_hi ( mut_ty. ty . span . lo ( ) ) ;
0 commit comments