@@ -1447,25 +1447,24 @@ emitTupleDispatch(ArrayRef<RowToSpecialize> rows, ConsumableManagedValue src,
1447
1447
return emitTupleObjectDispatch (rows, src, handleCase, outerFailure);
1448
1448
}
1449
1449
1450
- auto sourceType = cast<TupleType>(firstPat-> getType ()-> getCanonicalType ());
1451
-
1450
+ // At this point we know that we must have an address only type, since we
1451
+ // would have loaded it earlier.
1452
1452
SILValue v = src.getFinalManagedValue ().forward (SGF);
1453
+ assert (v->getType ().isAddressOnly (SGF.getModule ()) &&
1454
+ " Loadable values were handled earlier" );
1455
+
1453
1456
SmallVector<ConsumableManagedValue, 4 > destructured;
1454
1457
1455
1458
// Break down the values.
1456
1459
auto tupleSILTy = v->getType ();
1457
- for (unsigned i = 0 , e = sourceType ->getNumElements (); i < e; ++i ) {
1460
+ for (unsigned i : range (tupleSILTy. castTo <TupleType>() ->getNumElements ()) ) {
1458
1461
SILType fieldTy = tupleSILTy.getTupleElementType (i);
1459
1462
auto &fieldTL = SGF.getTypeLowering (fieldTy);
1460
1463
1461
- SILValue member;
1462
- if (tupleSILTy.isAddress ()) {
1463
- member = SGF.B .createTupleElementAddr (loc, v, i, fieldTy);
1464
- if (!fieldTL.isAddressOnly ())
1465
- member =
1466
- fieldTL.emitLoad (SGF.B , loc, member, LoadOwnershipQualifier::Take);
1467
- } else {
1468
- member = SGF.B .createTupleExtract (loc, v, i, fieldTy);
1464
+ SILValue member = SGF.B .createTupleElementAddr (loc, v, i, fieldTy);
1465
+ if (!fieldTL.isAddressOnly ()) {
1466
+ member =
1467
+ fieldTL.emitLoad (SGF.B , loc, member, LoadOwnershipQualifier::Take);
1469
1468
}
1470
1469
auto memberCMV = getManagedSubobject (SGF, member, fieldTL,
1471
1470
src.getFinalConsumption ());
0 commit comments