Skip to content

Commit add4185

Browse files
committed
AST: Fix infinite recursion with recursive same-type constraints
We diagnose and flag these in finalize(), but we can encounter one even earlier through resolveDependentMemberTypes(). Do the same thing there that we already do in EquivalenceClass::getTypeInContext(). Fixes <rdar://problem/45328122>, <https://bugs.swift.org/browse/SR-9022>.
1 parent 6afb81d commit add4185

File tree

2 files changed

+12
-0
lines changed

2 files changed

+12
-0
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3875,6 +3875,12 @@ static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
38753875
if (equivClass->recursiveConcreteType)
38763876
return ErrorType::get(Type(type));
38773877

3878+
// Prevent recursive substitution.
3879+
equivClass->recursiveConcreteType = true;
3880+
SWIFT_DEFER {
3881+
equivClass->recursiveConcreteType = false;
3882+
};
3883+
38783884
return resolveDependentMemberTypes(builder, equivClass->concreteType);
38793885
}
38803886

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// RUN: not %target-swift-frontend -typecheck %s
2+
3+
class Graph<V>: Collection {
4+
typealias Iterator = AnyIterator<V>
5+
typealias Index = Int
6+
}

0 commit comments

Comments
 (0)