aboutsummaryrefslogtreecommitdiff
path: root/lib/Serialization/ASTWriter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Serialization/ASTWriter.cpp')
-rw-r--r--lib/Serialization/ASTWriter.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp
index cfc83f7bc0..e59a3d39d1 100644
--- a/lib/Serialization/ASTWriter.cpp
+++ b/lib/Serialization/ASTWriter.cpp
@@ -3483,6 +3483,7 @@ void ASTWriter::ResolveDeclUpdatesBlocks() {
case UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION:
case UPD_CXX_ADDED_ANONYMOUS_NAMESPACE:
case UPD_OBJC_SET_CLASS_DEFINITIONDATA:
+ case UPD_OBJC_SET_PROTOCOL_DEFINITIONDATA:
URec[Idx] = GetDeclRef(reinterpret_cast<Decl *>(URec[Idx]));
++Idx;
break;
@@ -4447,6 +4448,24 @@ void ASTWriter::CompletedObjCForwardRef(const ObjCContainerDecl *D) {
}
}
}
+
+ if (const ObjCProtocolDecl *PD = dyn_cast<ObjCProtocolDecl>(D)) {
+ for (ObjCProtocolDecl::redecl_iterator I = PD->redecls_begin(),
+ E = PD->redecls_end();
+ I != E; ++I) {
+ if (*I == PD)
+ continue;
+
+ // We are interested when a PCH decl is modified.
+ if (I->isFromASTFile()) {
+ UpdateRecord &Record = DeclUpdates[*I];
+ Record.push_back(UPD_OBJC_SET_PROTOCOL_DEFINITIONDATA);
+ assert((*I)->hasDefinition());
+ assert((*I)->getDefinition() == D);
+ Record.push_back(reinterpret_cast<uint64_t>(D)); // the DefinitionDecl
+ }
+ }
+ }
}
void ASTWriter::AddedObjCPropertyInClassExtension(const ObjCPropertyDecl *Prop,