@@ -2342,8 +2342,11 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
2342
2342
switch (BAI->getAccessKind ()) {
2343
2343
case SILAccessKind::Init:
2344
2344
case SILAccessKind::Deinit:
2345
- require (BAI->getEnforcement () == SILAccessEnforcement::Static,
2346
- " init/deinit accesses cannot use non-static enforcement" );
2345
+ // A signed access preserves the access marker until IRGen
2346
+ require (
2347
+ BAI->getEnforcement () == SILAccessEnforcement::Static ||
2348
+ BAI->getEnforcement () == SILAccessEnforcement::Signed,
2349
+ " init/deinit accesses cannot use non-static/non-signed enforcement" );
2347
2350
break ;
2348
2351
2349
2352
case SILAccessKind::Read:
@@ -3286,7 +3289,10 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
3286
3289
EI->getForwardingOwnershipKind () == OwnershipKind::Guaranteed,
3287
3290
" invalid forwarding ownership kind on tuple_extract instruction" );
3288
3291
3289
- require (!EI->getStructDecl ()->isNonTrivialPtrAuth (),
3292
+ require (!EI->getModule ()
3293
+ .getOptions ()
3294
+ .EnableImportPtrauthFieldFunctionPointers ||
3295
+ !EI->getField ()->getPointerAuthQualifier ().isPresent (),
3290
3296
" Imported structs with ptrauth qualified fields should not be "
3291
3297
" promoted to a value" );
3292
3298
@@ -3337,7 +3343,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
3337
3343
require (EI->getField ()->getDeclContext () == sd,
3338
3344
" struct_element_addr field is not a member of the struct" );
3339
3345
3340
- if (EI->getStructDecl ()->isNonTrivialPtrAuth ()) {
3346
+ if (EI->getModule ().getOptions ().EnableImportPtrauthFieldFunctionPointers &&
3347
+ EI->getField ()->getPointerAuthQualifier ().isPresent ()) {
3341
3348
for (auto *use : EI->getUses ()) {
3342
3349
auto *bai = dyn_cast<BeginAccessInst>(use->getUser ());
3343
3350
require (bai && bai->getEnforcement () == SILAccessEnforcement::Signed,
0 commit comments