Skip to content

Commit 0165e3e

Browse files
committed
Sema: Force synthesized witnesses of derived conformances in override checking
This is a more elegant path to ensuring that init(from:) and encode(to:) get synthesized than synthesizeMemberForLookup().
1 parent f6b67f3 commit 0165e3e

File tree

2 files changed

+22
-13
lines changed

2 files changed

+22
-13
lines changed

lib/Sema/TypeCheckDecl.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5185,25 +5185,25 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
51855185
if (decl->isInvalid() || decl->getOverriddenDecl())
51865186
return false;
51875187

5188+
// Ignore accessor methods (e.g. getters and setters), they will be handled
5189+
// when their storage decl is processed.
5190+
if (isa<AccessorDecl>(decl))
5191+
return false;
5192+
51885193
auto *dc = decl->getDeclContext();
51895194

51905195
auto owningTy = dc->getDeclaredInterfaceType();
51915196
if (!owningTy)
51925197
return false;
51935198

5194-
auto classDecl = owningTy->getClassOrBoundGenericClass();
5199+
auto classDecl = dc->getAsClassOrClassExtensionContext();
51955200
if (!classDecl)
51965201
return false;
51975202

51985203
Type superclass = classDecl->getSuperclass();
51995204
if (!superclass)
52005205
return false;
52015206

5202-
// Ignore accessor methods (e.g. getters and setters), they will be handled
5203-
// when their storage decl is processed.
5204-
if (isa<AccessorDecl>(decl))
5205-
return false;
5206-
52075207
auto method = dyn_cast<AbstractFunctionDecl>(decl);
52085208
ConstructorDecl *ctor = nullptr;
52095209
if (method)
@@ -5279,12 +5279,6 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
52795279
// visible via dynamic dispatch.
52805280
lookupOptions -= NameLookupFlags::DynamicLookup;
52815281

5282-
// Class methods cannot override declarations only
5283-
// visible as protocol requirements or protocol
5284-
// extension members.
5285-
lookupOptions -= NameLookupFlags::ProtocolMembers;
5286-
lookupOptions -= NameLookupFlags::PerformConformanceCheck;
5287-
52885282
members = TC.lookupMember(dc, superclass,
52895283
name, lookupOptions);
52905284
}
@@ -5298,7 +5292,10 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
52985292
if (member->getKind() != decl->getKind())
52995293
continue;
53005294

5301-
if (!dc->getAsClassOrClassExtensionContext())
5295+
// Class methods cannot override declarations only
5296+
// visible as protocol requirements or protocol
5297+
// extension members.
5298+
if (!member->getDeclContext()->getAsClassOrClassExtensionContext())
53025299
continue;
53035300

53045301
auto parentDecl = cast<ValueDecl>(member);

test/decl/class/override.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,15 @@ class DerivedWithFilePrivateSetter: BaseWithFilePrivateSetter {
350350
set { }
351351
}
352352
}
353+
354+
protocol HasExtension {}
355+
356+
extension HasExtension {
357+
func extensionMethod() {}
358+
}
359+
360+
class BaseExtended : HasExtension {}
361+
362+
class DerivedExtended : BaseExtended {
363+
func extensionMethod() {}
364+
}

0 commit comments

Comments
 (0)