@@ -3368,15 +3368,27 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
3368
3368
// /
3369
3369
// / This should be kept conservative. Compiler crashes are still better than
3370
3370
// / miscompiles.
3371
- static bool overriddenDeclAffectsABI (const ValueDecl *overridden) {
3371
+ static bool overriddenDeclAffectsABI (const ValueDecl *override ,
3372
+ const ValueDecl *overridden) {
3372
3373
if (!overridden)
3373
3374
return false ;
3374
- // There's one case where we know a declaration doesn't affect the ABI of
3375
+ // There's a few cases where we know a declaration doesn't affect the ABI of
3375
3376
// its overrides after they've been compiled: if the declaration is '@objc'
3376
3377
// and 'dynamic'. In that case, all accesses to the method or property will
3377
3378
// go through the Objective-C method tables anyway.
3378
3379
if (overridden->hasClangNode () || overridden->shouldUseObjCDispatch ())
3379
3380
return false ;
3381
+
3382
+ // In a public-override-internal case, the override doesn't have ABI
3383
+ // implications.
3384
+ auto isPublic = [](const ValueDecl *VD) {
3385
+ return VD->getFormalAccessScope (VD->getDeclContext (),
3386
+ /* treatUsableFromInlineAsPublic*/ true )
3387
+ .isPublic ();
3388
+ };
3389
+ if (isPublic (override ) && !isPublic (overridden))
3390
+ return false ;
3391
+
3380
3392
return true ;
3381
3393
}
3382
3394
@@ -4067,7 +4079,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
4067
4079
fn->isImplicitlyUnwrappedOptional (),
4068
4080
S.addDeclRef (fn->getOperatorDecl ()),
4069
4081
S.addDeclRef (fn->getOverriddenDecl ()),
4070
- overriddenDeclAffectsABI (fn->getOverriddenDecl ()),
4082
+ overriddenDeclAffectsABI (fn, fn ->getOverriddenDecl ()),
4071
4083
fn->getName ().getArgumentNames ().size () +
4072
4084
fn->getName ().isCompoundName (),
4073
4085
rawAccessLevel,
@@ -4159,7 +4171,7 @@ class Serializer::DeclSerializer : public DeclVisitor<DeclSerializer> {
4159
4171
uint8_t (getStableAccessorKind (fn->getAccessorKind ()));
4160
4172
4161
4173
bool overriddenAffectsABI =
4162
- overriddenDeclAffectsABI (fn->getOverriddenDecl ());
4174
+ overriddenDeclAffectsABI (fn, fn ->getOverriddenDecl ());
4163
4175
4164
4176
Type ty = fn->getInterfaceType ();
4165
4177
SmallVector<IdentifierID, 4 > dependencies;
0 commit comments