@@ -8,7 +8,6 @@ use build::ForGuard::{self, OutsideGuard, RefWithinGuard, ValWithinGuard};
88use build:: { BlockAnd , BlockAndExtension , Builder } ;
99use build:: { GuardFrame , GuardFrameLocal , LocalsForNode } ;
1010use hair:: * ;
11- use hair:: pattern:: PatternTypeProjections ;
1211use rustc:: mir:: * ;
1312use rustc:: ty:: { self , Ty } ;
1413use rustc:: ty:: layout:: VariantIdx ;
@@ -412,7 +411,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
412411 debug ! ( "declare_bindings: patterns={:?}" , patterns) ;
413412 self . visit_bindings (
414413 & patterns[ 0 ] ,
415- & PatternTypeProjections :: none ( ) ,
414+ UserTypeProjections :: none ( ) ,
416415 & mut |this, mutability, name, mode, var, span, ty, user_ty| {
417416 if visibility_scope. is_none ( ) {
418417 visibility_scope =
@@ -488,7 +487,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
488487 pub ( super ) fn visit_bindings (
489488 & mut self ,
490489 pattern : & Pattern < ' tcx > ,
491- pattern_user_ty : & PatternTypeProjections < ' tcx > ,
490+ pattern_user_ty : UserTypeProjections < ' tcx > ,
492491 f : & mut impl FnMut (
493492 & mut Self ,
494493 Mutability ,
@@ -497,7 +496,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
497496 NodeId ,
498497 Span ,
499498 Ty < ' tcx > ,
500- & PatternTypeProjections < ' tcx > ,
499+ UserTypeProjections < ' tcx > ,
501500 ) ,
502501 ) {
503502 debug ! ( "visit_bindings: pattern={:?} pattern_user_ty={:?}" , pattern, pattern_user_ty) ;
@@ -511,7 +510,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
511510 ref subpattern,
512511 ..
513512 } => {
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 ( ) ) ;
515514 if let Some ( subpattern) = subpattern. as_ref ( ) {
516515 self . visit_bindings ( subpattern, pattern_user_ty, f) ;
517516 }
@@ -529,42 +528,47 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
529528 let from = u32:: try_from ( prefix. len ( ) ) . unwrap ( ) ;
530529 let to = u32:: try_from ( suffix. len ( ) ) . unwrap ( ) ;
531530 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) ;
533532 }
534533 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) ;
536535 }
537536 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) ;
539538 }
540539 }
541540 PatternKind :: Constant { .. } | PatternKind :: Range { .. } | PatternKind :: Wild => { }
542541 PatternKind :: Deref { ref subpattern } => {
543- self . visit_bindings ( subpattern, & pattern_user_ty. deref ( ) , f) ;
542+ self . visit_bindings ( subpattern, pattern_user_ty. deref ( ) , f) ;
544543 }
545544 PatternKind :: AscribeUserType { ref subpattern, ref user_ty, user_ty_span } => {
546545 // This corresponds to something like
547546 //
548547 // ```
549548 // let A::<'a>(_): A<'static> = ...;
550549 // ```
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)
553557 }
554558
555559 PatternKind :: Leaf { ref subpatterns } => {
556560 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 ) ;
558562 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) ;
560564 }
561565 }
562566
563567 PatternKind :: Variant { adt_def, substs : _, variant_index, ref subpatterns } => {
564568 for subpattern in subpatterns {
565- let subpattern_user_ty = pattern_user_ty. variant (
569+ let subpattern_user_ty = pattern_user_ty. clone ( ) . variant (
566570 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) ;
568572 }
569573 }
570574 }
@@ -1465,7 +1469,7 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
14651469 num_patterns : usize ,
14661470 var_id : NodeId ,
14671471 var_ty : Ty < ' tcx > ,
1468- user_var_ty : & PatternTypeProjections < ' tcx > ,
1472+ user_ty : UserTypeProjections < ' tcx > ,
14691473 has_guard : ArmHasGuard ,
14701474 opt_match_place : Option < ( Option < Place < ' tcx > > , Span ) > ,
14711475 pat_span : Span ,
@@ -1481,7 +1485,6 @@ impl<'a, 'gcx, 'tcx> Builder<'a, 'gcx, 'tcx> {
14811485 BindingMode :: ByValue => ty:: BindingMode :: BindByValue ( mutability. into ( ) ) ,
14821486 BindingMode :: ByRef { .. } => ty:: BindingMode :: BindByReference ( mutability. into ( ) ) ,
14831487 } ;
1484- let user_ty = user_var_ty. clone ( ) . user_ty ( & mut self . canonical_user_type_annotations ) ;
14851488 debug ! ( "declare_binding: user_ty={:?}" , user_ty) ;
14861489 let local = LocalDecl :: < ' tcx > {
14871490 mutability,
0 commit comments