Skip to content

Commit b0dd825

Browse files
committed
Prevent the normal tuple instructions from being used with pack expansions
1 parent a15a2e8 commit b0dd825

File tree

2 files changed

+20
-10
lines changed

2 files changed

+20
-10
lines changed

include/swift/SIL/SILBuilder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1675,6 +1675,9 @@ class SILBuilder {
16751675
SILValue Operand,
16761676
unsigned FieldNo,
16771677
SILType ResultTy) {
1678+
assert(!Operand->getType().castTo<TupleType>().containsPackExpansionType()
1679+
&& "tuples with pack expansions must be indexed with "
1680+
"tuple_pack_element_addr");
16781681
return insert(new (getModule()) TupleElementAddrInst(
16791682
getSILDebugLocation(Loc), Operand, FieldNo, ResultTy));
16801683
}

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3097,6 +3097,9 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
30973097

30983098
void checkTupleInst(TupleInst *TI) {
30993099
CanTupleType ResTy = requireObjectType(TupleType, TI, "Result of tuple");
3100+
require(!ResTy.containsPackExpansionType(),
3101+
"tuple instruction cannot be used with tuples containing "
3102+
"pack expansions");
31003103

31013104
require(TI->getElements().size() == ResTy->getNumElements(),
31023105
"Tuple field count mismatch!");
@@ -3288,6 +3291,10 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
32883291
void checkTupleExtractInst(TupleExtractInst *EI) {
32893292
CanTupleType operandTy = requireObjectType(TupleType, EI->getOperand(),
32903293
"Operand of tuple_extract");
3294+
require(!operandTy.containsPackExpansionType(),
3295+
"tuple_extract cannot be used with tuples containing "
3296+
"pack expansions");
3297+
32913298
require(EI->getType().isObject(),
32923299
"result of tuple_extract must be object");
32933300

@@ -3343,21 +3350,21 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
33433350
}
33443351

33453352
void checkTupleElementAddrInst(TupleElementAddrInst *EI) {
3346-
SILType operandTy = EI->getOperand()->getType();
3347-
require(operandTy.isAddress(),
3348-
"must derive element_addr from address");
33493353
require(EI->getType().isAddress(),
33503354
"result of tuple_element_addr must be address");
3351-
require(operandTy.is<TupleType>(),
3352-
"must derive tuple_element_addr from tuple");
3353-
3354-
ArrayRef<TupleTypeElt> fields = operandTy.castTo<TupleType>()->getElements();
3355-
require(EI->getFieldIndex() < fields.size(),
3356-
"invalid field index for element_addr instruction");
3355+
SILType operandTy = EI->getOperand()->getType();
3356+
auto tupleType = requireAddressType(TupleType, operandTy,
3357+
"operand of tuple_element_addr must be the address of a tuple");
3358+
require(!tupleType.containsPackExpansionType(),
3359+
"tuple_element_addr cannot be used with tuples containing "
3360+
"pack expansions");
3361+
3362+
require(EI->getFieldIndex() < tupleType->getNumElements(),
3363+
"invalid field index for tuple_element_addr instruction");
33573364
if (EI->getModule().getStage() != SILStage::Lowered) {
33583365
requireSameType(
33593366
EI->getType().getASTType(),
3360-
CanType(fields[EI->getFieldIndex()].getType()),
3367+
tupleType.getElementType(EI->getFieldIndex()),
33613368
"type of tuple_element_addr does not match type of element");
33623369
}
33633370
}

0 commit comments

Comments
 (0)