@@ -406,7 +406,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
406
406
pat : & ' tcx Pat < ' tcx > ,
407
407
expected : Ty < ' tcx > ,
408
408
mut def_br : ByRef ,
409
- mut max_ref_mutability : MutblCap ,
409
+ mut max_ref_mutbl : MutblCap ,
410
410
) -> ( Ty < ' tcx > , ByRef , MutblCap ) {
411
411
let mut expected = self . try_structurally_resolve_type ( pat. span , expected) ;
412
412
// Peel off as many `&` or `&mut` from the scrutinee type as possible. For example,
@@ -438,10 +438,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
438
438
} ) ;
439
439
}
440
440
441
- if pat . span . at_least_rust_2024 ( ) && self . tcx . features ( ) . ref_pat_eat_one_layer_2024 {
442
- def_br = def_br. cap_ref_mutability ( max_ref_mutability . as_mutbl ( ) ) ;
441
+ if self . tcx . features ( ) . ref_pat_eat_one_layer_2024 {
442
+ def_br = def_br. cap_ref_mutability ( max_ref_mutbl . as_mutbl ( ) ) ;
443
443
if def_br == ByRef :: Yes ( Mutability :: Not ) {
444
- max_ref_mutability = MutblCap :: Not ;
444
+ max_ref_mutbl = MutblCap :: Not ;
445
445
}
446
446
}
447
447
@@ -453,7 +453,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
453
453
. insert ( pat. hir_id , pat_adjustments) ;
454
454
}
455
455
456
- ( expected, def_br, max_ref_mutability )
456
+ ( expected, def_br, max_ref_mutbl )
457
457
}
458
458
459
459
fn check_pat_lit (
@@ -2131,18 +2131,22 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2131
2131
mut expected : Ty < ' tcx > ,
2132
2132
mut pat_info : PatInfo < ' tcx , ' _ > ,
2133
2133
) -> Ty < ' tcx > {
2134
- let new_match_ergonomics =
2135
- pat. span . at_least_rust_2024 ( ) && self . tcx . features ( ) . ref_pat_eat_one_layer_2024 ;
2134
+ let no_ref_mut_behind_and = self . tcx . features ( ) . ref_pat_eat_one_layer_2024 ;
2135
+ let new_match_ergonomics = pat. span . at_least_rust_2024 ( ) && no_ref_mut_behind_and ;
2136
2136
2137
- if new_match_ergonomics {
2138
- let pat_prefix_span =
2139
- inner. span . find_ancestor_inside ( pat. span ) . map ( |end| pat. span . until ( end) ) ;
2137
+ let pat_prefix_span =
2138
+ inner. span . find_ancestor_inside ( pat. span ) . map ( |end| pat. span . until ( end) ) ;
2140
2139
2140
+ if no_ref_mut_behind_and {
2141
2141
if pat_mutbl == Mutability :: Not {
2142
2142
// Prevent the inner pattern from binding with `ref mut`.
2143
2143
pat_info. max_ref_mutbl = pat_info. max_ref_mutbl . cap_to_weakly_not ( pat_prefix_span) ;
2144
2144
}
2145
+ } else {
2146
+ pat_info. max_ref_mutbl = MutblCap :: Mut ;
2147
+ }
2145
2148
2149
+ if new_match_ergonomics {
2146
2150
if let ByRef :: Yes ( inh_mut) = pat_info. binding_mode {
2147
2151
// ref pattern consumes inherited reference
2148
2152
@@ -2180,8 +2184,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2180
2184
. rust_2024_migration_desugared_pats_mut ( )
2181
2185
. insert ( pat_info. top_info . hir_id ) ;
2182
2186
}
2183
-
2184
- pat_info. max_ref_mutbl = MutblCap :: Mut ;
2185
2187
}
2186
2188
2187
2189
let tcx = self . tcx ;
@@ -2196,16 +2198,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2196
2198
// the bad interactions of the given hack detailed in (note_1).
2197
2199
debug ! ( "check_pat_ref: expected={:?}" , expected) ;
2198
2200
match * expected. kind ( ) {
2199
- ty:: Ref ( _, r_ty, r_mutbl) if r_mutbl >= pat_mutbl && new_match_ergonomics => {
2200
- if r_mutbl == Mutability :: Not {
2201
+ ty:: Ref ( _, r_ty, r_mutbl)
2202
+ if ( new_match_ergonomics && r_mutbl >= pat_mutbl)
2203
+ || r_mutbl == pat_mutbl =>
2204
+ {
2205
+ if no_ref_mut_behind_and && r_mutbl == Mutability :: Not {
2201
2206
pat_info. max_ref_mutbl = MutblCap :: Not ;
2202
2207
}
2203
2208
2204
2209
( expected, r_ty)
2205
2210
}
2206
2211
2207
- ty:: Ref ( _, r_ty, r_mutbl) if r_mutbl == pat_mutbl => ( expected, r_ty) ,
2208
-
2209
2212
_ => {
2210
2213
let inner_ty = self . next_ty_var ( inner. span ) ;
2211
2214
let ref_ty = self . new_ref_ty ( pat. span , pat_mutbl, inner_ty) ;
0 commit comments