diff options
Diffstat (limited to 'lib/Serialization/ASTWriter.cpp')
-rw-r--r-- | lib/Serialization/ASTWriter.cpp | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 6cce0afc50..b3f76f7494 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -3439,6 +3439,7 @@ void ASTWriter::ResolveDeclUpdatesBlocks() { case UPD_CXX_ADDED_IMPLICIT_MEMBER: case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION: case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE: + case UPD_OBJC_SET_CLASS_DEFINITIONDATA: URec[Idx] = GetDeclRef(reinterpret_cast<Decl *>(URec[Idx])); ++Idx; break; @@ -4379,10 +4380,26 @@ void ASTWriter::AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD, void ASTWriter::CompletedObjCForwardRef(const ObjCContainerDecl *D) { assert(!WritingAST && "Already writing the AST!"); - if (!D->isFromASTFile()) - return; // Declaration not imported from PCH. + if (D->isFromASTFile()) + RewriteDecl(D); - RewriteDecl(D); + if (const ObjCInterfaceDecl *ID = dyn_cast<ObjCInterfaceDecl>(D)) { + for (ObjCInterfaceDecl::redecl_iterator I = ID->redecls_begin(), + E = ID->redecls_end(); + I != E; ++I) { + if (*I == ID) + continue; + + // We are interested when a PCH decl is modified. + if (I->isFromASTFile()) { + UpdateRecord &Record = DeclUpdates[*I]; + Record.push_back(UPD_OBJC_SET_CLASS_DEFINITIONDATA); + assert((*I)->hasDefinition()); + assert((*I)->getDefinition() == D); + Record.push_back(reinterpret_cast<uint64_t>(D)); // the DefinitionDecl + } + } + } } void ASTWriter::AddedObjCPropertyInClassExtension(const ObjCPropertyDecl *Prop, |