@@ -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