Skip to content

Commit 132a471

Browse files
committed
Sema: Minor fixes
1 parent aaf016c commit 132a471

File tree

4 files changed

+27
-24
lines changed

4 files changed

+27
-24
lines changed

lib/AST/Decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2185,7 +2185,7 @@ GenericTypeDecl::GenericTypeDecl(DeclKind K, DeclContext *DC,
21852185

21862186

21872187
void GenericTypeDecl::setGenericParams(GenericParamList *params) {
2188-
// Set the specified generic parameters onto this type alias, setting
2188+
// Set the specified generic parameters onto this type declaration, setting
21892189
// the parameters' context along the way.
21902190
GenericParams = params;
21912191
if (params)

lib/Sema/TypeCheckDecl.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4236,7 +4236,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
42364236
}
42374237

42384238
bool semaFuncParamPatterns(AbstractFunctionDecl *fd,
4239-
GenericTypeResolver *resolver = nullptr) {
4239+
GenericTypeResolver *resolver) {
42404240
bool hadError = false;
42414241
for (auto paramList : fd->getParameterLists()) {
42424242
hadError |= TC.typeCheckParameterList(paramList, fd,
@@ -6449,7 +6449,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
64496449
}
64506450

64516451
// Type check the constructor parameters.
6452-
if (CD->isInvalid() || semaFuncParamPatterns(CD)) {
6452+
GenericTypeToArchetypeResolver resolver;
6453+
if (CD->isInvalid() || semaFuncParamPatterns(CD, &resolver)) {
64536454
CD->overwriteType(ErrorType::get(TC.Context));
64546455
CD->setInterfaceType(ErrorType::get(TC.Context));
64556456
CD->setInvalid();
@@ -6598,7 +6599,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
65986599
DD->getDeclContext()->getGenericEnvironmentOfContext());
65996600
}
66006601

6601-
if (semaFuncParamPatterns(DD)) {
6602+
GenericTypeToArchetypeResolver resolver;
6603+
if (semaFuncParamPatterns(DD, &resolver)) {
66026604
DD->overwriteType(ErrorType::get(TC.Context));
66036605
DD->setInterfaceType(ErrorType::get(TC.Context));
66046606
DD->setInvalid();

lib/Sema/TypeCheckGeneric.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -466,18 +466,14 @@ static Type getResultType(TypeChecker &TC, FuncDecl *fn, Type resultType) {
466466
// in the TypeRepr. Because of this, Sema isn't able to rebuild it in
467467
// terms of interface types. When interface types prevail, this should be
468468
// removed. Until then, we hack the mapping here.
469-
return ArchetypeBuilder::mapTypeOutOfContext(fn, resultType);
469+
return ArchetypeBuilder::mapTypeOutOfContext(fn->getDeclContext(), resultType);
470470
}
471471

472472
return resultType;
473473
}
474474

475475
GenericEnvironment *
476476
TypeChecker::markInvalidGenericSignature(DeclContext *DC) {
477-
// If there aren't any generic parameters at this level, we're done.
478-
if (!DC->isInnermostContextGeneric())
479-
return nullptr;
480-
481477
GenericParamList *genericParams = DC->getGenericParamsOfContext();
482478
GenericSignature *genericSig = DC->getGenericSignatureOfContext();
483479

@@ -488,20 +484,24 @@ TypeChecker::markInvalidGenericSignature(DeclContext *DC) {
488484
auto parentSig = parentDC->getGenericSignatureOfContext();
489485
auto parentEnv = parentDC->getGenericEnvironmentOfContext();
490486

487+
assert(parentSig != nullptr || DC->isInnermostContextGeneric());
488+
491489
if (parentSig != nullptr)
492490
builder.addGenericSignature(parentSig, parentEnv);
493491

494-
// Visit each of the generic parameters.
495-
for (auto param : *genericParams)
496-
builder.addGenericParameter(param);
492+
if (DC->isInnermostContextGeneric()) {
493+
// Visit each of the generic parameters.
494+
for (auto param : *genericParams)
495+
builder.addGenericParameter(param);
496+
497+
for (auto GP : *genericParams)
498+
GP->setArchetype(builder.getArchetype(GP));
499+
}
497500

498501
// Wire up the archetypes.
499502
auto genericEnv = builder.getGenericEnvironment(
500503
genericSig->getGenericParams());
501504

502-
for (auto GP : *genericParams)
503-
GP->setArchetype(builder.getArchetype(GP));
504-
505505
return genericEnv;
506506
}
507507

@@ -626,7 +626,7 @@ void TypeChecker::configureInterfaceType(AbstractFunctionDecl *func) {
626626
initArgTy = func->computeInterfaceSelfType(/*isInitializingCtor=*/true);
627627
}
628628
} else {
629-
argTy = paramLists[e - i - 1]->getInterfaceType(func);
629+
argTy = paramLists[e - i - 1]->getInterfaceType(func->getDeclContext());
630630

631631
if (initFuncTy)
632632
initArgTy = argTy;

lib/Sema/TypeCheckType.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -629,21 +629,22 @@ static void diagnoseUnboundGenericType(TypeChecker &tc, Type ty,SourceLoc loc) {
629629
// Currently it only works if all the generic arguments have a super type,
630630
// or it requires a class, in which case it infers 'AnyObject'.
631631
auto inferGenericArgs = [](GenericTypeDecl *genericD)->std::string {
632-
GenericParamList *genParamList = genericD->getGenericParams();
633-
if (!genParamList)
632+
auto *mod = genericD->getParentModule();
633+
auto *genericSig = genericD->getGenericSignature();
634+
if (!genericSig)
634635
return std::string();
635-
auto params= genParamList->getParams();
636+
637+
auto params = genericSig->getInnermostGenericParams();
636638
if (params.empty())
637639
return std::string();
638640
std::string argsToAdd = "<";
639641
for (unsigned i = 0, e = params.size(); i != e; ++i) {
640642
auto param = params[i];
641-
auto archTy = param->getArchetype();
642-
if (!archTy)
643-
return std::string();
644-
if (auto superTy = archTy->getSuperclass()) {
643+
if (auto superTy = genericSig->getSuperclassBound(param, *mod)) {
644+
if (superTy->hasTypeParameter())
645+
return std::string(); // give up
645646
argsToAdd += superTy.getString();
646-
} else if (archTy->requiresClass()) {
647+
} else if (genericSig->requiresClass(param, *mod)) {
647648
argsToAdd += "AnyObject";
648649
} else {
649650
return std::string(); // give up.

0 commit comments

Comments
 (0)