@@ -3389,10 +3389,23 @@ class ArgEmitter {
3389
3389
// If the source expression is a tuple literal, we can break it
3390
3390
// up directly.
3391
3391
if (auto tuple = dyn_cast<TupleExpr>(e)) {
3392
- for (auto i : indices (tuple->getElements ())) {
3393
- emit (tuple->getElement (i),
3394
- origParamType.getTupleElementType (i));
3395
- }
3392
+ auto substTupleType =
3393
+ cast<TupleType>(e->getType ()->getCanonicalType ());
3394
+ origParamType.forEachTupleElement (substTupleType,
3395
+ [&](unsigned origEltIndex, unsigned substEltIndex,
3396
+ AbstractionPattern origEltType, CanType substEltType) {
3397
+ emit (tuple->getElement (substEltIndex), origEltType);
3398
+ },
3399
+ [&](unsigned origEltIndex, unsigned substEltIndex,
3400
+ AbstractionPattern origExpansionType,
3401
+ CanTupleEltTypeArrayRef substEltTypes) {
3402
+ SmallVector<ArgumentSource, 4 > eltArgs;
3403
+ eltArgs.reserve (substEltTypes.size ());
3404
+ for (auto i : range (substEltIndex, substEltTypes.size ())) {
3405
+ eltArgs.emplace_back (tuple->getElement (i));
3406
+ }
3407
+ emitPackArg (eltArgs, origExpansionType);
3408
+ });
3396
3409
return ;
3397
3410
}
3398
3411
0 commit comments