Skip to content

Commit 284fbf9

Browse files
committed
Sema: Fix crash when override checking encounters circularity
getInterfaceType() will return an ErrorType if the declaration is currently being validated, which can happen if override checking triggers associated type inference. I believe this is <rdar://problem/47220065>.
1 parent 2f34df9 commit 284fbf9

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,16 @@ Type swift::getMemberTypeForComparison(ASTContext &ctx, ValueDecl *member,
7777
SubscriptDecl *subscript = dyn_cast_or_null<SubscriptDecl>(abstractStorage);
7878

7979
auto memberType = member->getInterfaceType();
80+
if (memberType->is<ErrorType>())
81+
return memberType;
82+
8083
if (derivedDecl) {
8184
auto *dc = derivedDecl->getDeclContext();
8285
auto owningType = dc->getDeclaredInterfaceType();
8386
assert(owningType);
8487

8588
memberType = owningType->adjustSuperclassMemberDeclType(member, derivedDecl,
8689
memberType);
87-
if (memberType->hasError())
88-
return memberType;
8990
}
9091

9192
if (method) {

test/decl/circularity.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,19 @@ extension SIMD3 {
5555
extension SIMD3 where SIMD3.Scalar == Float {
5656
static let pickMe = SIMD3(.pickMe)
5757
}
58+
59+
// Test case with circular overrides
60+
protocol P {
61+
associatedtype A
62+
func run(a: A)
63+
}
64+
65+
class C1 {
66+
func run(a: Int) {}
67+
}
68+
69+
class C2: C1, P {
70+
override func run(a: A) {}
71+
// expected-error@-1 {{circular reference}}
72+
// expected-note@-2 2{{through reference here}}
73+
}

0 commit comments

Comments
 (0)