Skip to content

Commit 26b9ace

Browse files
authored
Merge pull request #15098 from gottesmm/pr-f309e803f5f44c142f6aa97a7f91950512ab47d4
[+0-all-args] Make sure that when we use RValue::addElement to combin…
2 parents 7e170c7 + 7c90e70 commit 26b9ace

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

lib/SILGen/SILGenExpr.cpp

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2412,10 +2412,28 @@ RValue RValueEmitter::visitTupleExpr(TupleExpr *E, SGFContext C) {
24122412
return RValue::forInContext();
24132413
}
24142414
}
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.
24162426
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+
24192437
return result;
24202438
}
24212439

@@ -2756,7 +2774,7 @@ RValue RValueEmitter::visitTupleShuffleExpr(TupleShuffleExpr *E,
27562774
shuffleIndex != TupleShuffleExpr::Variadic &&
27572775
"Only argument tuples can have default initializers & varargs");
27582776

2759-
result.addElement(std::move(elements[shuffleIndex]));
2777+
result.addElement(std::move(elements[shuffleIndex]).ensurePlusOne(SGF, E));
27602778
return result;
27612779
}
27622780

@@ -2777,7 +2795,8 @@ RValue RValueEmitter::visitTupleShuffleExpr(TupleShuffleExpr *E,
27772795
// separately.
27782796
if (shuffleIndex != TupleShuffleExpr::Variadic) {
27792797
// Map from a different tuple element.
2780-
result.addElement(std::move(elements[shuffleIndex]));
2798+
result.addElement(
2799+
std::move(elements[shuffleIndex]).ensurePlusOne(SGF, E));
27812800
continue;
27822801
}
27832802

@@ -2799,8 +2818,9 @@ RValue RValueEmitter::visitTupleShuffleExpr(TupleShuffleExpr *E,
27992818
ManagedValue varargs = emitVarargs(SGF, E, field.getVarargBaseTy(),
28002819
variadicValues,
28012820
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));
28042824
break;
28052825
}
28062826

0 commit comments

Comments
 (0)