@@ -80,6 +80,7 @@ use ty::adjustment;
8080use  ty:: { self ,  Ty ,  TyCtxt } ; 
8181
8282use  hir:: { MutImmutable ,  MutMutable ,  PatKind } ; 
83+ use  hir:: pat_util:: EnumerateAndAdjustIterator ; 
8384use  hir; 
8485use  syntax:: ast; 
8586use  syntax:: codemap:: Span ; 
@@ -1225,14 +1226,13 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
12251226            // _ 
12261227          } 
12271228
1228-           PatKind :: TupleStruct ( _,  None )  => { 
1229-             // variant(..) 
1230-           } 
1231-           PatKind :: TupleStruct ( _,  Some ( ref  subpats) )  => { 
1229+           PatKind :: TupleStruct ( _,  ref  subpats,  ddpos)  => { 
12321230            match  opt_def { 
1233-                 Some ( Def :: Variant ( .. ) )  => { 
1231+                 Some ( Def :: Variant ( enum_def ,  def_id ) )  => { 
12341232                    // variant(x, y, z) 
1235-                     for  ( i,  subpat)  in  subpats. iter ( ) . enumerate ( )  { 
1233+                     let  expected_len = self . tcx ( ) . lookup_adt_def ( enum_def) 
1234+                                                  . variant_with_id ( def_id) . fields . len ( ) ; 
1235+                     for  ( i,  subpat)  in  subpats. iter ( ) . enumerate_and_adjust ( expected_len,  ddpos)  { 
12361236                        let  subpat_ty = self . pat_ty ( & subpat) ?;  // see (*2) 
12371237
12381238                        let  subcmt =
@@ -1244,7 +1244,16 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
12441244                    } 
12451245                } 
12461246                Some ( Def :: Struct ( ..) )  => { 
1247-                     for  ( i,  subpat)  in  subpats. iter ( ) . enumerate ( )  { 
1247+                     let  expected_len = match  self . pat_ty ( & pat)  { 
1248+                         Ok ( & ty:: TyS { sty :  ty:: TyStruct ( adt_def,  _) ,  ..} )  => { 
1249+                             adt_def. struct_variant ( ) . fields . len ( ) 
1250+                         } 
1251+                         ref  ty => { 
1252+                             span_bug ! ( pat. span,  "tuple struct pattern unexpected type {:?}" ,  ty) ; 
1253+                         } 
1254+                     } ; 
1255+ 
1256+                     for  ( i,  subpat)  in  subpats. iter ( ) . enumerate_and_adjust ( expected_len,  ddpos)  { 
12481257                        let  subpat_ty = self . pat_ty ( & subpat) ?;  // see (*2) 
12491258                        let  cmt_field =
12501259                            self . cat_imm_interior ( 
@@ -1284,9 +1293,13 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
12841293            } 
12851294          } 
12861295
1287-           PatKind :: Tup ( ref  subpats)  => { 
1296+           PatKind :: Tuple ( ref  subpats,  ddpos )  => { 
12881297            // (p1, ..., pN) 
1289-             for  ( i,  subpat)  in  subpats. iter ( ) . enumerate ( )  { 
1298+             let  expected_len = match  self . pat_ty ( & pat)  { 
1299+                 Ok ( & ty:: TyS { sty :  ty:: TyTuple ( ref  tys) ,  ..} )  => tys. len ( ) , 
1300+                 ref  ty => span_bug ! ( pat. span,  "tuple pattern unexpected type {:?}" ,  ty) , 
1301+             } ; 
1302+             for  ( i,  subpat)  in  subpats. iter ( ) . enumerate_and_adjust ( expected_len,  ddpos)  { 
12901303                let  subpat_ty = self . pat_ty ( & subpat) ?;  // see (*2) 
12911304                let  subcmt =
12921305                    self . cat_imm_interior ( 
0 commit comments