diff --git a/lib/Serialization/Deserialization.cpp b/lib/Serialization/Deserialization.cpp index 03244b0acc5..6a12d8902fb 100644 --- a/lib/Serialization/Deserialization.cpp +++ b/lib/Serialization/Deserialization.cpp @@ -944,15 +944,15 @@ Decl *ModuleFile::getDecl(DeclID DID, Optional ForcedContext, case decls_block::CONSTRUCTOR_DECL: { DeclID parentID; - bool isImplicit, hasSelectorStyleSignature, isObjC; + bool isImplicit, hasSelectorStyleSignature, isObjC, isTransparent; TypeID signatureID; TypeID interfaceID; DeclID implicitSelfID; decls_block::ConstructorLayout::readRecord(scratch, parentID, isImplicit, hasSelectorStyleSignature, - isObjC, signatureID, - interfaceID, + isObjC, isTransparent, + signatureID, interfaceID, implicitSelfID); auto parent = getDeclContext(parentID); if (declOrOffset.isComplete()) @@ -1026,6 +1026,8 @@ Decl *ModuleFile::getDecl(DeclID DID, Optional ForcedContext, if (hasSelectorStyleSignature) ctor->setHasSelectorStyleSignature(); ctor->setIsObjC(isObjC); + if (isTransparent) + ctor->getMutableAttrs().setAttr(AK_transparent, SourceLoc()); if (genericParams) for (auto &genericParam : *ctor->getGenericParams()) diff --git a/lib/Serialization/ModuleFormat.h b/lib/Serialization/ModuleFormat.h index f12076dc3e0..ebaafe0e0d6 100644 --- a/lib/Serialization/ModuleFormat.h +++ b/lib/Serialization/ModuleFormat.h @@ -625,6 +625,7 @@ namespace decls_block { BCFixed<1>, // implicit? BCFixed<1>, // has selector-style signature? BCFixed<1>, // objc? + BCFixed<1>, // transparent? TypeIDField, // type (signature) TypeIDField, // type (interface) DeclIDField // implicit this decl @@ -654,7 +655,7 @@ namespace decls_block { BCFixed<1>, // class method? BCFixed<1>, // assignment? / conversion? BCFixed<1>, // explicitly objc? - BCFixed<1>, // iboutlet? + BCFixed<1>, // ibaction? BCFixed<1>, // transparent? BCVBR<5>, // number of parameter patterns TypeIDField, // type (signature) diff --git a/lib/Serialization/Serialization.cpp b/lib/Serialization/Serialization.cpp index ad131aa0c3a..427d172e2e8 100644 --- a/lib/Serialization/Serialization.cpp +++ b/lib/Serialization/Serialization.cpp @@ -943,6 +943,12 @@ void Serializer::writeDecl(const Decl *D) { case DeclKind::Extension: { auto extension = cast(D); + DeclAttributes remainingAttrs = extension->getAttrs(); + // @transparent on extensions is propagated down to the methods and + // constructors during serialization. + remainingAttrs.clearAttribute(AK_transparent); + assert(remainingAttrs.empty() && "unhandled extension attrs"); + const Decl *DC = getDeclForContext(extension->getDeclContext()); Type baseTy = extension->getExtendedType(); @@ -1260,7 +1266,7 @@ void Serializer::writeDecl(const Decl *D) { fn->getAttrs().isConversion(), fn->isObjC(), fn->getAttrs().isIBAction(), - fn->getAttrs().isTransparent(), + fn->isTransparent(), fn->getArgParamPatterns().size(), addTypeRef(fn->getType()), addTypeRef(fn->getInterfaceType()), @@ -1345,6 +1351,7 @@ void Serializer::writeDecl(const Decl *D) { ctor->isImplicit(), ctor->hasSelectorStyleSignature(), ctor->isObjC(), + ctor->isTransparent(), addTypeRef(ctor->getType()), addTypeRef(ctor->getInterfaceType()), addDeclRef(implicitSelf));