diff --git a/lib/Sema/TypeCheckDecl.cpp b/lib/Sema/TypeCheckDecl.cpp index 514087f2d45..d54410a3d7f 100644 --- a/lib/Sema/TypeCheckDecl.cpp +++ b/lib/Sema/TypeCheckDecl.cpp @@ -1202,6 +1202,11 @@ public: TAD->setInvalid(); TAD->overwriteType(ErrorType::get(TC.Context)); TAD->getUnderlyingTypeLoc().setType(ErrorType::get(TC.Context)); + } else if (TAD->getDeclContext()->isGenericContext() && + !TAD->getInterfaceType()) { + TAD->setInterfaceType( + TC.getInterfaceTypeFromInternalType(TAD->getDeclContext(), + TAD->getType())); } if (!isa(TAD->getDeclContext())) diff --git a/lib/Serialization/Deserialization.cpp b/lib/Serialization/Deserialization.cpp index 431263d58b5..0675b01c781 100644 --- a/lib/Serialization/Deserialization.cpp +++ b/lib/Serialization/Deserialization.cpp @@ -789,11 +789,12 @@ Decl *ModuleFile::getDecl(DeclID DID, Optional ForcedContext, case decls_block::TYPE_ALIAS_DECL: { IdentifierID nameID; DeclID contextID; - TypeID underlyingTypeID; + TypeID underlyingTypeID, interfaceTypeID; bool isImplicit; decls_block::TypeAliasLayout::readRecord(scratch, nameID, contextID, - underlyingTypeID, isImplicit); + underlyingTypeID, interfaceTypeID, + isImplicit); auto DC = ForcedContext ? *ForcedContext : getDeclContext(contextID); auto underlyingType = TypeLoc::withoutLoc(getType(underlyingTypeID)); @@ -806,6 +807,9 @@ Decl *ModuleFile::getDecl(DeclID DID, Optional ForcedContext, DC, { }); declOrOffset = alias; + if (auto interfaceType = getType(interfaceTypeID)) + alias->setInterfaceType(interfaceType); + if (isImplicit) alias->setImplicit(); diff --git a/lib/Serialization/ModuleFormat.h b/lib/Serialization/ModuleFormat.h index 92a25eeadbf..51800e62e58 100644 --- a/lib/Serialization/ModuleFormat.h +++ b/lib/Serialization/ModuleFormat.h @@ -550,6 +550,7 @@ namespace decls_block { IdentifierIDField, // name DeclIDField, // context decl TypeIDField, // underlying type + TypeIDField, // interface type BCFixed<1> // implicit flag // Trailed by the conformance info (if any). >; diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index 3a2a8270518..e0ff52aa3ae 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -1094,6 +1094,7 @@ void Serializer::writeDecl(const Decl *D) { addIdentifierRef(typeAlias->getName()), addDeclRef(DC), addTypeRef(underlying), + addTypeRef(typeAlias->getInterfaceType()), typeAlias->isImplicit()); writeConformances(typeAlias->getProtocols(), typeAlias->getConformances(),