@@ -2412,10 +2412,28 @@ RValue RValueEmitter::visitTupleExpr(TupleExpr *E, SGFContext C) {
2412
2412
return RValue::forInContext ();
2413
2413
}
2414
2414
}
2415
-
2415
+
2416
+ llvm::SmallVector<RValue, 8 > tupleElts;
2417
+ bool hasAtleastOnePlusOneValue = false ;
2418
+ for (Expr *elt : E->getElements ()) {
2419
+ RValue RV = SGF.emitRValue (elt);
2420
+ hasAtleastOnePlusOneValue |= RV.isPlusOne (SGF);
2421
+ tupleElts.emplace_back (std::move (RV));
2422
+ }
2423
+
2424
+ // Once we have found if we have any plus one arguments, add each element of
2425
+ // tuple elts into result, making sure each value is at plus 1.
2416
2426
RValue result (type);
2417
- for (Expr *elt : E->getElements ())
2418
- result.addElement (SGF.emitRValue (elt));
2427
+ if (hasAtleastOnePlusOneValue) {
2428
+ for (unsigned i : indices (tupleElts)) {
2429
+ result.addElement (std::move (tupleElts[i]).ensurePlusOne (SGF, E));
2430
+ }
2431
+ } else {
2432
+ for (unsigned i : indices (tupleElts)) {
2433
+ result.addElement (std::move (tupleElts[i]));
2434
+ }
2435
+ }
2436
+
2419
2437
return result;
2420
2438
}
2421
2439
@@ -2756,7 +2774,7 @@ RValue RValueEmitter::visitTupleShuffleExpr(TupleShuffleExpr *E,
2756
2774
shuffleIndex != TupleShuffleExpr::Variadic &&
2757
2775
" Only argument tuples can have default initializers & varargs" );
2758
2776
2759
- result.addElement (std::move (elements[shuffleIndex]));
2777
+ result.addElement (std::move (elements[shuffleIndex]). ensurePlusOne (SGF, E) );
2760
2778
return result;
2761
2779
}
2762
2780
@@ -2777,7 +2795,8 @@ RValue RValueEmitter::visitTupleShuffleExpr(TupleShuffleExpr *E,
2777
2795
// separately.
2778
2796
if (shuffleIndex != TupleShuffleExpr::Variadic) {
2779
2797
// Map from a different tuple element.
2780
- result.addElement (std::move (elements[shuffleIndex]));
2798
+ result.addElement (
2799
+ std::move (elements[shuffleIndex]).ensurePlusOne (SGF, E));
2781
2800
continue ;
2782
2801
}
2783
2802
@@ -2799,8 +2818,9 @@ RValue RValueEmitter::visitTupleShuffleExpr(TupleShuffleExpr *E,
2799
2818
ManagedValue varargs = emitVarargs (SGF, E, field.getVarargBaseTy (),
2800
2819
variadicValues,
2801
2820
E->getVarargsArrayType ());
2802
- result.addElement (RValue (SGF, E, field.getType ()->getCanonicalType (),
2803
- varargs));
2821
+ result.addElement (
2822
+ RValue (SGF, E, field.getType ()->getCanonicalType (), varargs)
2823
+ .ensurePlusOne (SGF, E));
2804
2824
break ;
2805
2825
}
2806
2826
0 commit comments