@@ -426,9 +426,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
426
426
// If the binding is like `ref x | ref const x | ref mut x`
427
427
// then `x` is assigned a value of type `&M T` where M is the
428
428
// mutability and T is the expected type.
429
- let region_var = self . next_region_var ( infer:: PatternRegion ( pat. span ) ) ;
430
- let mt = ty:: TypeAndMut { ty : expected, mutbl } ;
431
- let region_ty = self . tcx . mk_ref ( region_var, mt) ;
429
+ let region_ty = self . new_ref_ty ( pat. span , mutbl, expected) ;
432
430
433
431
// `x` is assigned a value of type `&M T`, hence `&M T <: typeof(x)`
434
432
// is required. However, we use equality, which is stronger.
@@ -971,9 +969,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
971
969
span : inner. span ,
972
970
}
973
971
) ;
974
- let mt = ty:: TypeAndMut { ty : inner_ty, mutbl } ;
975
- let region = self . next_region_var ( infer:: PatternRegion ( pat. span ) ) ;
976
- let rptr_ty = tcx. mk_ref ( region, mt) ;
972
+ let rptr_ty = self . new_ref_ty ( pat. span , mutbl, inner_ty) ;
977
973
debug ! ( "check_pat_ref: demanding {:?} = {:?}" , expected, rptr_ty) ;
978
974
let err = self . demand_eqtype_diag ( pat. span , expected, rptr_ty) ;
979
975
@@ -995,6 +991,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
995
991
}
996
992
}
997
993
994
+ /// Create a reference type with a fresh region variable.
995
+ fn new_ref_ty ( & self , span : Span , mutbl : hir:: Mutability , ty : Ty < ' tcx > ) -> Ty < ' tcx > {
996
+ let region = self . next_region_var ( infer:: PatternRegion ( span) ) ;
997
+ let mt = ty:: TypeAndMut { ty, mutbl } ;
998
+ self . tcx . mk_ref ( region, mt)
999
+ }
1000
+
998
1001
fn check_pat_slice (
999
1002
& self ,
1000
1003
span : Span ,
0 commit comments