@@ -18,7 +18,7 @@ use rustc_middle::mir::interpret::LitToConstInput;
18
18
use rustc_middle:: thir:: {
19
19
Ascription , FieldPat , LocalVarId , Pat , PatKind , PatRange , PatRangeBoundary ,
20
20
} ;
21
- use rustc_middle:: ty:: adjustment:: PatAdjustment ;
21
+ use rustc_middle:: ty:: adjustment:: { PatAdjust , PatAdjustment } ;
22
22
use rustc_middle:: ty:: layout:: IntegerExt ;
23
23
use rustc_middle:: ty:: { self , CanonicalUserTypeAnnotation , Ty , TyCtxt , TypingMode } ;
24
24
use rustc_middle:: { bug, span_bug} ;
@@ -68,9 +68,11 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
68
68
self . typeck_results . pat_adjustments ( ) . get ( pat. hir_id ) . map_or ( & [ ] , |v| & * * v) ;
69
69
70
70
// Track the default binding mode for the Rust 2024 migration suggestion.
71
+ // Implicitly dereferencing references changes the default binding mode, but implicit deref
72
+ // patterns do not. Only track binding mode changes if a ref type is in the adjustments.
71
73
let mut opt_old_mode_span = None ;
72
74
if let Some ( s) = & mut self . rust_2024_migration
73
- && ! adjustments. is_empty ( )
75
+ && adjustments. iter ( ) . any ( |adjust| adjust . source . is_ref ( ) )
74
76
{
75
77
opt_old_mode_span = s. visit_implicit_derefs ( pat. span , adjustments) ;
76
78
}
@@ -104,16 +106,22 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
104
106
} ;
105
107
106
108
let adjusted_pat = adjustments. iter ( ) . rev ( ) . fold ( unadjusted_pat, |thir_pat, adjust| {
107
- debug ! ( "{:?}: wrapping pattern with type {:?}" , thir_pat, adjust) ;
108
- Box :: new ( Pat {
109
- span : thir_pat. span ,
110
- ty : adjust. source ,
111
- kind : PatKind :: Deref { subpattern : thir_pat } ,
112
- } )
109
+ debug ! ( "{:?}: wrapping pattern with adjustment {:?}" , thir_pat, adjust) ;
110
+ let span = thir_pat. span ;
111
+ let kind = match adjust. kind {
112
+ PatAdjust :: BuiltinDeref => PatKind :: Deref { subpattern : thir_pat } ,
113
+ PatAdjust :: OverloadedDeref => {
114
+ let mutable = self . typeck_results . pat_has_ref_mut_binding ( pat) ;
115
+ let mutability =
116
+ if mutable { hir:: Mutability :: Mut } else { hir:: Mutability :: Not } ;
117
+ PatKind :: DerefPattern { subpattern : thir_pat, mutability }
118
+ }
119
+ } ;
120
+ Box :: new ( Pat { span, ty : adjust. source , kind } )
113
121
} ) ;
114
122
115
123
if let Some ( s) = & mut self . rust_2024_migration
116
- && ! adjustments. is_empty ( )
124
+ && adjustments. iter ( ) . any ( |adjust| adjust . source . is_ref ( ) )
117
125
{
118
126
s. leave_ref ( opt_old_mode_span) ;
119
127
}
0 commit comments