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