@@ -8,7 +8,6 @@ use build::ForGuard::{self, OutsideGuard, RefWithinGuard, ValWithinGuard};
8
8
use build:: { BlockAnd , BlockAndExtension , Builder } ;
9
9
use build:: { GuardFrame , GuardFrameLocal , LocalsForNode } ;
10
10
use hair:: * ;
11
- use hair:: pattern:: PatternTypeProjections ;
12
11
use rustc:: mir:: * ;
13
12
use rustc:: ty:: { self , Ty } ;
14
13
use rustc:: ty:: layout:: VariantIdx ;
@@ -412,7 +411,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
412
411
debug ! ( "declare_bindings: patterns={:?}" , patterns) ;
413
412
self . visit_bindings (
414
413
& patterns[ 0 ] ,
415
- & PatternTypeProjections :: none ( ) ,
414
+ UserTypeProjections :: none ( ) ,
416
415
& mut |this, mutability, name, mode, var, span, ty, user_ty| {
417
416
if visibility_scope. is_none ( ) {
418
417
visibility_scope =
@@ -488,7 +487,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
488
487
pub ( super ) fn visit_bindings (
489
488
& mut self ,
490
489
pattern : & Pattern < ' tcx > ,
491
- pattern_user_ty : & PatternTypeProjections < ' tcx > ,
490
+ pattern_user_ty : UserTypeProjections < ' tcx > ,
492
491
f : & mut impl FnMut (
493
492
& mut Self ,
494
493
Mutability ,
@@ -497,7 +496,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
497
496
NodeId ,
498
497
Span ,
499
498
Ty < ' tcx > ,
500
- & PatternTypeProjections < ' tcx > ,
499
+ UserTypeProjections < ' tcx > ,
501
500
) ,
502
501
) {
503
502
debug ! ( "visit_bindings: pattern={:?} pattern_user_ty={:?}" , pattern, pattern_user_ty) ;
@@ -511,7 +510,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
511
510
ref subpattern,
512
511
..
513
512
} => {
514
- f ( self , mutability, name, mode, var, pattern. span , ty, pattern_user_ty) ;
513
+ f ( self , mutability, name, mode, var, pattern. span , ty, pattern_user_ty. clone ( ) ) ;
515
514
if let Some ( subpattern) = subpattern. as_ref ( ) {
516
515
self . visit_bindings ( subpattern, pattern_user_ty, f) ;
517
516
}
@@ -529,42 +528,47 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
529
528
let from = u32:: try_from ( prefix. len ( ) ) . unwrap ( ) ;
530
529
let to = u32:: try_from ( suffix. len ( ) ) . unwrap ( ) ;
531
530
for subpattern in prefix {
532
- self . visit_bindings ( subpattern, & pattern_user_ty. index ( ) , f) ;
531
+ self . visit_bindings ( subpattern, pattern_user_ty. clone ( ) . index ( ) , f) ;
533
532
}
534
533
for subpattern in slice {
535
- self . visit_bindings ( subpattern, & pattern_user_ty. subslice ( from, to) , f) ;
534
+ self . visit_bindings ( subpattern, pattern_user_ty. clone ( ) . subslice ( from, to) , f) ;
536
535
}
537
536
for subpattern in suffix {
538
- self . visit_bindings ( subpattern, & pattern_user_ty. index ( ) , f) ;
537
+ self . visit_bindings ( subpattern, pattern_user_ty. clone ( ) . index ( ) , f) ;
539
538
}
540
539
}
541
540
PatternKind :: Constant { .. } | PatternKind :: Range { .. } | PatternKind :: Wild => { }
542
541
PatternKind :: Deref { ref subpattern } => {
543
- self . visit_bindings ( subpattern, & pattern_user_ty. deref ( ) , f) ;
542
+ self . visit_bindings ( subpattern, pattern_user_ty. deref ( ) , f) ;
544
543
}
545
544
PatternKind :: AscribeUserType { ref subpattern, ref user_ty, user_ty_span } => {
546
545
// This corresponds to something like
547
546
//
548
547
// ```
549
548
// let A::<'a>(_): A<'static> = ...;
550
549
// ```
551
- let subpattern_user_ty = pattern_user_ty. add_user_type ( user_ty, user_ty_span) ;
552
- self . visit_bindings ( subpattern, & subpattern_user_ty, f)
550
+ let annotation = ( user_ty_span, user_ty. base ) ;
551
+ let projection = UserTypeProjection {
552
+ base : self . canonical_user_type_annotations . push ( annotation) ,
553
+ projs : user_ty. projs . clone ( ) ,
554
+ } ;
555
+ let subpattern_user_ty = pattern_user_ty. push_projection ( & projection, user_ty_span) ;
556
+ self . visit_bindings ( subpattern, subpattern_user_ty, f)
553
557
}
554
558
555
559
PatternKind :: Leaf { ref subpatterns } => {
556
560
for subpattern in subpatterns {
557
- let subpattern_user_ty = pattern_user_ty. leaf ( subpattern. field ) ;
561
+ let subpattern_user_ty = pattern_user_ty. clone ( ) . leaf ( subpattern. field ) ;
558
562
debug ! ( "visit_bindings: subpattern_user_ty={:?}" , subpattern_user_ty) ;
559
- self . visit_bindings ( & subpattern. pattern , & subpattern_user_ty, f) ;
563
+ self . visit_bindings ( & subpattern. pattern , subpattern_user_ty, f) ;
560
564
}
561
565
}
562
566
563
567
PatternKind :: Variant { adt_def, substs : _, variant_index, ref subpatterns } => {
564
568
for subpattern in subpatterns {
565
- let subpattern_user_ty = pattern_user_ty. variant (
569
+ let subpattern_user_ty = pattern_user_ty. clone ( ) . variant (
566
570
adt_def, variant_index, subpattern. field ) ;
567
- self . visit_bindings ( & subpattern. pattern , & subpattern_user_ty, f) ;
571
+ self . visit_bindings ( & subpattern. pattern , subpattern_user_ty, f) ;
568
572
}
569
573
}
570
574
}
@@ -1465,7 +1469,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
1465
1469
num_patterns : usize ,
1466
1470
var_id : NodeId ,
1467
1471
var_ty : Ty < ' tcx > ,
1468
- user_var_ty : & PatternTypeProjections < ' tcx > ,
1472
+ user_ty : UserTypeProjections < ' tcx > ,
1469
1473
has_guard : ArmHasGuard ,
1470
1474
opt_match_place : Option < ( Option < Place < ' tcx > > , Span ) > ,
1471
1475
pat_span : Span ,
@@ -1481,7 +1485,6 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
1481
1485
BindingMode :: ByValue => ty:: BindingMode :: BindByValue ( mutability. into ( ) ) ,
1482
1486
BindingMode :: ByRef { .. } => ty:: BindingMode :: BindByReference ( mutability. into ( ) ) ,
1483
1487
} ;
1484
- let user_ty = user_var_ty. clone ( ) . user_ty ( & mut self . canonical_user_type_annotations ) ;
1485
1488
debug ! ( "declare_binding: user_ty={:?}" , user_ty) ;
1486
1489
let local = LocalDecl :: < ' tcx > {
1487
1490
mutability,
0 commit comments