@@ -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 (
@@ -2130,18 +2130,22 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2130
2130
mut expected : Ty < ' tcx > ,
2131
2131
mut pat_info : PatInfo < ' tcx , ' _ > ,
2132
2132
) -> Ty < ' tcx > {
2133
- let new_match_ergonomics =
2134
- pat. span . at_least_rust_2024 ( ) && self . tcx . features ( ) . ref_pat_eat_one_layer_2024 ;
2133
+ let no_ref_mut_behind_and = self . tcx . features ( ) . ref_pat_eat_one_layer_2024 ;
2134
+ let new_match_ergonomics = pat. span . at_least_rust_2024 ( ) && no_ref_mut_behind_and ;
2135
2135
2136
- if new_match_ergonomics {
2137
- let pat_prefix_span =
2138
- inner. span . find_ancestor_inside ( pat. span ) . map ( |end| pat. span . until ( end) ) ;
2136
+ let pat_prefix_span =
2137
+ inner. span . find_ancestor_inside ( pat. span ) . map ( |end| pat. span . until ( end) ) ;
2139
2138
2139
+ if no_ref_mut_behind_and {
2140
2140
if pat_mutbl == Mutability :: Not {
2141
2141
// Prevent the inner pattern from binding with `ref mut`.
2142
2142
pat_info. max_ref_mutbl = pat_info. max_ref_mutbl . cap_to_weakly_not ( pat_prefix_span) ;
2143
2143
}
2144
+ } else {
2145
+ pat_info. max_ref_mutbl = MutblCap :: Mut ;
2146
+ }
2144
2147
2148
+ if new_match_ergonomics {
2145
2149
if let ByRef :: Yes ( inh_mut) = pat_info. binding_mode {
2146
2150
// ref pattern consumes inherited reference
2147
2151
@@ -2179,8 +2183,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2179
2183
. rust_2024_migration_desugared_pats_mut ( )
2180
2184
. insert ( pat_info. top_info . hir_id ) ;
2181
2185
}
2182
-
2183
- pat_info. max_ref_mutbl = MutblCap :: Mut ;
2184
2186
}
2185
2187
2186
2188
let tcx = self . tcx ;
@@ -2195,16 +2197,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
2195
2197
// the bad interactions of the given hack detailed in (note_1).
2196
2198
debug ! ( "check_pat_ref: expected={:?}" , expected) ;
2197
2199
match * expected. kind ( ) {
2198
- ty:: Ref ( _, r_ty, r_mutbl) if r_mutbl >= pat_mutbl && new_match_ergonomics => {
2199
- if r_mutbl == Mutability :: Not {
2200
+ ty:: Ref ( _, r_ty, r_mutbl)
2201
+ if ( new_match_ergonomics && r_mutbl >= pat_mutbl)
2202
+ || r_mutbl == pat_mutbl =>
2203
+ {
2204
+ if no_ref_mut_behind_and && r_mutbl == Mutability :: Not {
2200
2205
pat_info. max_ref_mutbl = MutblCap :: Not ;
2201
2206
}
2202
2207
2203
2208
( expected, r_ty)
2204
2209
}
2205
2210
2206
- ty:: Ref ( _, r_ty, r_mutbl) if r_mutbl == pat_mutbl => ( expected, r_ty) ,
2207
-
2208
2211
_ => {
2209
2212
let inner_ty = self . next_ty_var ( inner. span ) ;
2210
2213
let ref_ty = self . new_ref_ty ( pat. span , pat_mutbl, inner_ty) ;
0 commit comments