@@ -18,7 +18,7 @@ use rustc_middle::mir::interpret::LitToConstInput;
1818use rustc_middle:: thir:: {
1919 Ascription , FieldPat , LocalVarId , Pat , PatKind , PatRange , PatRangeBoundary ,
2020} ;
21- use rustc_middle:: ty:: adjustment:: PatAdjustment ;
21+ use rustc_middle:: ty:: adjustment:: { PatAdjust , PatAdjustment } ;
2222use rustc_middle:: ty:: layout:: IntegerExt ;
2323use rustc_middle:: ty:: { self , CanonicalUserTypeAnnotation , Ty , TyCtxt , TypingMode } ;
2424use rustc_middle:: { bug, span_bug} ;
@@ -68,9 +68,11 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
6868 self . typeck_results . pat_adjustments ( ) . get ( pat. hir_id ) . map_or ( & [ ] , |v| & * * v) ;
6969
7070 // 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.
7173 let mut opt_old_mode_span = None ;
7274 if let Some ( s) = & mut self . rust_2024_migration
73- && ! adjustments. is_empty ( )
75+ && adjustments. iter ( ) . any ( |adjust| adjust . source . is_ref ( ) )
7476 {
7577 opt_old_mode_span = s. visit_implicit_derefs ( pat. span , adjustments) ;
7678 }
@@ -104,16 +106,22 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
104106 } ;
105107
106108 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 } )
113121 } ) ;
114122
115123 if let Some ( s) = & mut self . rust_2024_migration
116- && ! adjustments. is_empty ( )
124+ && adjustments. iter ( ) . any ( |adjust| adjust . source . is_ref ( ) )
117125 {
118126 s. leave_ref ( opt_old_mode_span) ;
119127 }
0 commit comments