Skip to content

Commit 851434c

Browse files
committed
[SILVerifier] Skip type access on skip resilience.
If resilience checks are bypassed, also bypass checks for type ABI accessibility.
1 parent 8959d4c commit 851434c

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ bool checkResilience(DeclType *D, ModuleDecl *M,
125125
D->isResilient(M, expansion);
126126
}
127127

128+
bool checkTypeABIAccessible(SILFunction const &F, SILType ty) {
129+
return F.getASTContext().LangOpts.BypassResilienceChecks ||
130+
F.isTypeABIAccessible(ty);
131+
}
132+
128133
/// Metaprogramming-friendly base class.
129134
template <class Impl>
130135
class SILVerifierBase : public SILInstructionVisitor<Impl> {
@@ -2907,7 +2912,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
29072912
"Dest address should be lvalue");
29082913
requireSameType(cai->getDest()->getType(), cai->getSrc()->getType(),
29092914
"Store operand type and dest type mismatch");
2910-
require(F.isTypeABIAccessible(cai->getDest()->getType()),
2915+
require(checkTypeABIAccessible(F, cai->getDest()->getType()),
29112916
"cannot directly copy type with inaccessible ABI");
29122917
require(cai->getModule().getStage() == SILStage::Raw ||
29132918
(cai->isTakeOfSrc() || !cai->getSrc()->getType().isMoveOnly()),
@@ -2922,7 +2927,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
29222927
"Dest address should be lvalue");
29232928
requireSameType(ecai->getDest()->getType(), ecai->getSrc()->getType(),
29242929
"Store operand type and dest type mismatch");
2925-
require(F.isTypeABIAccessible(ecai->getDest()->getType()),
2930+
require(checkTypeABIAccessible(F, ecai->getDest()->getType()),
29262931
"cannot directly copy type with inaccessible ABI");
29272932
}
29282933

@@ -2934,7 +2939,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
29342939
"Dest address should be lvalue");
29352940
requireSameType(SI->getDest()->getType(), SI->getSrc()->getType(),
29362941
"Store operand type and dest type mismatch");
2937-
require(F.isTypeABIAccessible(SI->getDest()->getType()),
2942+
require(checkTypeABIAccessible(F, SI->getDest()->getType()),
29382943
"cannot directly copy type with inaccessible ABI");
29392944
}
29402945

@@ -3356,7 +3361,7 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
33563361
void checkDestroyAddrInst(DestroyAddrInst *DI) {
33573362
require(DI->getOperand()->getType().isAddress(),
33583363
"Operand of destroy_addr must be address");
3359-
require(F.isTypeABIAccessible(DI->getOperand()->getType()),
3364+
require(checkTypeABIAccessible(F, DI->getOperand()->getType()),
33603365
"cannot directly destroy type with inaccessible ABI");
33613366
}
33623367

0 commit comments

Comments
 (0)