Skip to content

Commit faaa200

Browse files
AnthonyLatsisslavapestov
authored andcommitted
GSB: Handle concrete ResolvedTypes in ArchetypeType::resolveNestedType()
A nested type of an archetype type might be concrete, for example, via a same-type constraint: extension SomeProtocol where SomeAssoc == Int { ... Self.SomeAssoc ... } This can happen in one of two ways; either the EquivalenceClass of the nested type has a concrete type, or it is "fully concrete" because there is no equivalence class and maybeResolveEquivalenceClass() returns a ResolvedType storing the concrete type. For some reason we didn't handle the second case here. Fixes https://bugs.swift.org/browse/SR-13519 / rdar://problem/68531679
1 parent a144c20 commit faaa200

File tree

2 files changed

+32
-5
lines changed

2 files changed

+32
-5
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2633,16 +2633,24 @@ void ArchetypeType::resolveNestedType(
26332633
Type interfaceType = getInterfaceType();
26342634
Type memberInterfaceType =
26352635
DependentMemberType::get(interfaceType, nested.first);
2636-
auto equivClass =
2637-
builder.resolveEquivalenceClass(
2636+
auto resolved =
2637+
builder.maybeResolveEquivalenceClass(
26382638
memberInterfaceType,
2639-
ArchetypeResolutionKind::CompleteWellFormed);
2640-
if (!equivClass) {
2639+
ArchetypeResolutionKind::CompleteWellFormed,
2640+
/*wantExactPotentialArchetype=*/false);
2641+
if (!resolved) {
26412642
nested.second = ErrorType::get(interfaceType);
26422643
return;
26432644
}
26442645

2645-
auto result = equivClass->getTypeInContext(builder, genericEnv);
2646+
Type result;
2647+
if (auto concrete = resolved.getAsConcreteType()) {
2648+
result = concrete;
2649+
} else {
2650+
auto *equivClass = resolved.getEquivalenceClass(builder);
2651+
result = equivClass->getTypeInContext(builder, genericEnv);
2652+
}
2653+
26462654
assert(!nested.second ||
26472655
nested.second->isEqual(result) ||
26482656
(nested.second->hasError() && result->hasError()));
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// RUN: %target-swift-frontend -typecheck %s
2+
3+
// https://bugs.swift.org/browse/SR-13519
4+
5+
class Class: P {
6+
typealias A = Bool
7+
}
8+
9+
protocol P {
10+
associatedtype A
11+
}
12+
13+
protocol Q : P {
14+
func takesA(arg: A)
15+
}
16+
17+
func test<T: Class & Q>(arg: T) {
18+
arg.takesA(arg: true)
19+
}

0 commit comments

Comments
 (0)