Skip to content

Commit a3e03fa

Browse files
committed
[Type checker] Make sure 'dynamic' gets set consistently.
'dynamic' is inherited and only applies to '@objc' entities. The SourceKit test change is because we've changed our behavior slightly: we won't infer @objc from an override unless the override is correctly marked with 'override'. This is part of breaking up dependencies, and should have little effect outside of tests.
1 parent 7279eee commit a3e03fa

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1454,12 +1454,17 @@ static void inferDynamic(ASTContext &ctx, ValueDecl *D) {
14541454
(D->getOverriddenDecl() &&
14551455
D->getOverriddenDecl()->hasClangNode());
14561456

1457+
bool overridesDyanmic =
1458+
(D->getOverriddenDecl() &&
1459+
D->getOverriddenDecl()->isDynamic());
1460+
14571461
bool isNSManaged = D->getAttrs().hasAttribute<NSManagedAttr>();
14581462

14591463
bool isExtension = isa<ExtensionDecl>(D->getDeclContext());
14601464

14611465
// We only infer 'dynamic' in these three cases.
1462-
if (!isExtension && !isNSManaged && !overridesImportedMethod)
1466+
if (!isExtension && !isNSManaged && !overridesImportedMethod &&
1467+
!overridesDyanmic)
14631468
return;
14641469

14651470
// The presence of 'final' blocks the inference of 'dynamic'.

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1189,6 +1189,10 @@ namespace {
11891189
if (Override->isFinal())
11901190
return;
11911191

1192+
// Must be @objc to be 'dynamic'.
1193+
if (!Override->isObjC())
1194+
return;
1195+
11921196
makeDynamic(Override->getASTContext(), Override);
11931197
}
11941198

@@ -1483,22 +1487,27 @@ static bool recordOverride(TypeChecker &TC, ValueDecl *override,
14831487
diagnoseOverrideForAvailability(override, base);
14841488
}
14851489

1486-
/// Check attributes associated with the base; some may need to merged with
1487-
/// or checked against attributes in the overriding declaration.
1488-
AttributeOverrideChecker attrChecker(base, override);
1489-
for (auto attr : base->getAttrs()) {
1490-
attrChecker.visit(attr);
1491-
}
1492-
14931490
if (auto overridingFunc = dyn_cast<FuncDecl>(override)) {
14941491
overridingFunc->setOverriddenDecl(cast<FuncDecl>(base));
14951492
} else if (auto overridingCtor = dyn_cast<ConstructorDecl>(override)) {
14961493
overridingCtor->setOverriddenDecl(cast<ConstructorDecl>(base));
14971494
} else if (auto overridingASD = dyn_cast<AbstractStorageDecl>(override)) {
14981495
auto *baseASD = cast<AbstractStorageDecl>(base);
14991496
overridingASD->setOverriddenDecl(baseASD);
1497+
} else {
1498+
llvm_unreachable("Unexpected decl");
1499+
}
15001500

1501+
/// Check attributes associated with the base; some may need to merged with
1502+
/// or checked against attributes in the overriding declaration.
1503+
AttributeOverrideChecker attrChecker(base, override);
1504+
for (auto attr : base->getAttrs()) {
1505+
attrChecker.visit(attr);
1506+
}
1507+
1508+
if (auto overridingASD = dyn_cast<AbstractStorageDecl>(override)) {
15011509
// Make sure we get consistent overrides for the accessors as well.
1510+
auto *baseASD = cast<AbstractStorageDecl>(base);
15021511
assert(baseASD->getGetter());
15031512

15041513
auto recordAccessorOverride = [&](AccessorKind kind) {
@@ -1536,8 +1545,6 @@ static bool recordOverride(TypeChecker &TC, ValueDecl *override,
15361545
recordAccessorOverride(AccessorKind::Get);
15371546
recordAccessorOverride(AccessorKind::Set);
15381547
recordAccessorOverride(AccessorKind::MaterializeForSet);
1539-
} else {
1540-
llvm_unreachable("Unexpected decl");
15411548
}
15421549

15431550
return false;

test/SourceKit/CursorInfo/cursor_overrides.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ protocol Prot {
55
}
66

77
class Cls : S1, Prot {
8-
func meth() {}
8+
override func meth() {}
99
}
1010

1111
class SubCls : Cls {
12-
func meth() {}
12+
override func meth() {}
1313
}
1414

1515
func goo(x: SubCls) {
@@ -27,7 +27,7 @@ public protocol WithInheritedAssocType : WithAssocType {
2727

2828
// REQUIRES: objc_interop
2929
// RUN: %sourcekitd-test -req=cursor -pos=16:7 %s -- -embed-bitcode -I %S/Inputs/cursor-overrides %mcp_opt %s | %FileCheck -check-prefix=CHECK1 %s
30-
// CHECK1: source.lang.swift.ref.function.method.instance (12:8-12:14)
30+
// CHECK1: source.lang.swift.ref.function.method.instance (12:17-12:23)
3131
// CHECK1: c:@M@cursor_overrides@objc(cs)SubCls(im)meth
3232
// CHECK1: (SubCls) -> () -> ()
3333
// CHECK1: OVERRIDES BEGIN

0 commit comments

Comments
 (0)