Skip to content

Commit 3f7eb01

Browse files
committed
SIL: Verifier checks resilience invariants for struct instructions
1 parent 9c9ad09 commit 3f7eb01

File tree

1 file changed

+19
-1
lines changed

1 file changed

+19
-1
lines changed

lib/SIL/SILVerifier.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2072,6 +2072,9 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
20722072
require(!structDecl->hasUnreferenceableStorage(),
20732073
"Cannot build a struct with unreferenceable storage from elements "
20742074
"using StructInst");
2075+
require(!structDecl->isResilient(F.getModule().getSwiftModule(),
2076+
F.getResilienceExpansion()),
2077+
"cannot access storage of resilient struct");
20752078
require(SI->getType().isObject(),
20762079
"StructInst must produce an object");
20772080

@@ -2374,6 +2377,9 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
23742377
"result of struct_extract cannot be address");
23752378
StructDecl *sd = operandTy.getStructOrBoundGenericStruct();
23762379
require(sd, "must struct_extract from struct");
2380+
require(!sd->isResilient(F.getModule().getSwiftModule(),
2381+
F.getResilienceExpansion()),
2382+
"cannot access storage of resilient struct");
23772383
require(!EI->getField()->isStatic(),
23782384
"cannot get address of static property with struct_element_addr");
23792385
require(EI->getField()->hasStorage(),
@@ -2415,6 +2421,9 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
24152421
"must derive struct_element_addr from address");
24162422
StructDecl *sd = operandTy.getStructOrBoundGenericStruct();
24172423
require(sd, "struct_element_addr operand must be struct address");
2424+
require(!sd->isResilient(F.getModule().getSwiftModule(),
2425+
F.getResilienceExpansion()),
2426+
"cannot access storage of resilient struct");
24182427
require(EI->getType().isAddress(),
24192428
"result of struct_element_addr must be address");
24202429
require(!EI->getField()->isStatic(),
@@ -2465,7 +2474,16 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
24652474
ClassDecl *cd = operandTy.getClassOrBoundGenericClass();
24662475
require(cd, "ref_tail_addr operand must be a class instance");
24672476
}
2468-
2477+
2478+
void checkDestructureStructInst(DestructureStructInst *DSI) {
2479+
SILType operandTy = DSI->getOperand()->getType();
2480+
StructDecl *sd = operandTy.getStructOrBoundGenericStruct();
2481+
require(sd, "must struct_extract from struct");
2482+
require(!sd->isResilient(F.getModule().getSwiftModule(),
2483+
F.getResilienceExpansion()),
2484+
"cannot access storage of resilient struct");
2485+
}
2486+
24692487
SILType getMethodSelfType(CanSILFunctionType ft) {
24702488
return fnConv.getSILType(ft->getParameters().back());
24712489
}

0 commit comments

Comments
 (0)