Skip to content

Commit cc5d8a4

Browse files
authored
Merge pull request #3734 from slavapestov/generic-typealias-fix
2 parents 825ee70 + c55e0ee commit cc5d8a4

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,11 @@ void TypeChecker::configureInterfaceType(AbstractFunctionDecl *func) {
638638
if (i == 0 && func->hasThrows())
639639
info = info.withThrows();
640640

641+
assert(!argTy->hasArchetype());
642+
assert(!funcTy->hasArchetype());
643+
if (initFuncTy)
644+
assert(!initFuncTy->hasArchetype());
645+
641646
if (sig && i == e-1) {
642647
funcTy = GenericFunctionType::get(sig, argTy, funcTy, info);
643648
if (initFuncTy)
@@ -650,12 +655,9 @@ void TypeChecker::configureInterfaceType(AbstractFunctionDecl *func) {
650655
}
651656

652657
// Record the interface type.
653-
assert(!funcTy->hasArchetype());
654658
func->setInterfaceType(funcTy);
655-
if (initFuncTy) {
656-
assert(!initFuncTy->hasArchetype());
659+
if (initFuncTy)
657660
cast<ConstructorDecl>(func)->setInitializerInterfaceType(initFuncTy);
658-
}
659661

660662
if (func->getGenericParams()) {
661663
// Collect all generic params referenced in parameter types,

lib/Sema/TypeCheckType.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,8 +519,7 @@ Type TypeChecker::applyUnboundGenericArguments(
519519
if (auto outerSig = TAD->getDeclContext()->getGenericSignatureOfContext()) {
520520
for (auto outerParam : outerSig->getGenericParams()) {
521521
subs[outerParam->getCanonicalType().getPointer()] =
522-
ArchetypeBuilder::mapTypeIntoContext(TAD->getDeclContext(),
523-
outerParam);
522+
resolver->resolveGenericTypeParamType(outerParam);
524523
}
525524
}
526525

test/decl/typealias/generic.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ class GenericClass<T> {
164164
}
165165
}
166166

167+
let gc = GenericClass<Double>()
168+
let fn: MyType<Double, Int> = gc.testCapture(s: 1, t: 1.0)
169+
170+
func use<T>(_ t: T) {}
171+
use(fn)
172+
167173
// Make sure we apply base substitutions to the interface type of the typealias
168174
class ConcreteClass : GenericClass<String> {
169175
func testSubstitutedCapture1<S>(s: S, t: String) -> TA<S> {

0 commit comments

Comments
 (0)