aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/AST/ASTMutationListener.h3
-rw-r--r--include/clang/Serialization/ASTWriter.h1
-rw-r--r--lib/AST/DeclObjC.cpp6
-rw-r--r--lib/Serialization/ASTCommon.h5
-rw-r--r--lib/Serialization/ASTReaderDecl.cpp60
-rw-r--r--lib/Serialization/ASTWriter.cpp58
-rw-r--r--test/Modules/Inputs/redecl-merge-left-left.h2
-rw-r--r--test/Modules/Inputs/redecl-merge-right.h4
-rw-r--r--test/Modules/redecl-merge.m7
9 files changed, 38 insertions, 108 deletions
diff --git a/include/clang/AST/ASTMutationListener.h b/include/clang/AST/ASTMutationListener.h
index 551dffa747..a5d3d9c936 100644
--- a/include/clang/AST/ASTMutationListener.h
+++ b/include/clang/AST/ASTMutationListener.h
@@ -63,9 +63,6 @@ public:
virtual void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
const ObjCInterfaceDecl *IFD) {}
- /// \brief A objc interface or protocol forward reference was completed.
- virtual void CompletedObjCForwardRef(const ObjCContainerDecl *D) {}
-
/// \brief A objc class extension redeclared or introduced a property.
///
/// \param Prop the property in the class extension
diff --git a/include/clang/Serialization/ASTWriter.h b/include/clang/Serialization/ASTWriter.h
index c97c9f42c8..8852d5dc67 100644
--- a/include/clang/Serialization/ASTWriter.h
+++ b/include/clang/Serialization/ASTWriter.h
@@ -689,7 +689,6 @@ public:
virtual void StaticDataMemberInstantiated(const VarDecl *D);
virtual void AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
const ObjCInterfaceDecl *IFD);
- virtual void CompletedObjCForwardRef(const ObjCContainerDecl *D);
virtual void AddedObjCPropertyInClassExtension(const ObjCPropertyDecl *Prop,
const ObjCPropertyDecl *OrigProp,
const ObjCCategoryDecl *ClassExt);
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp
index b0aeabf68f..6a3bdfd4bb 100644
--- a/lib/AST/DeclObjC.cpp
+++ b/lib/AST/DeclObjC.cpp
@@ -245,9 +245,6 @@ void ObjCInterfaceDecl::startDefinition() {
if (*RD != this)
RD->Data = Data;
}
-
- if (ASTMutationListener *L = getASTContext().getASTMutationListener())
- L->CompletedObjCForwardRef(this);
}
/// getFirstClassExtension - Find first class extension of the given class.
@@ -1058,9 +1055,6 @@ void ObjCProtocolDecl::startDefinition() {
for (redecl_iterator RD = redecls_begin(), RDEnd = redecls_end();
RD != RDEnd; ++RD)
RD->Data = this->Data;
-
- if (ASTMutationListener *L = getASTContext().getASTMutationListener())
- L->CompletedObjCForwardRef(this);
}
//===----------------------------------------------------------------------===//
diff --git a/lib/Serialization/ASTCommon.h b/lib/Serialization/ASTCommon.h
index 2190844a83..16db8e3695 100644
--- a/lib/Serialization/ASTCommon.h
+++ b/lib/Serialization/ASTCommon.h
@@ -22,13 +22,10 @@ namespace clang {
namespace serialization {
enum DeclUpdateKind {
- UPD_CXX_SET_DEFINITIONDATA,
UPD_CXX_ADDED_IMPLICIT_MEMBER,
UPD_CXX_ADDED_TEMPLATE_SPECIALIZATION,
UPD_CXX_ADDED_ANONYMOUS_NAMESPACE,
- UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER,
- UPD_OBJC_SET_CLASS_DEFINITIONDATA,
- UPD_OBJC_SET_PROTOCOL_DEFINITIONDATA
+ UPD_CXX_INSTANTIATED_STATIC_DATA_MEMBER
};
TypeIdx TypeIdxFromBuiltin(const BuiltinType *BT);
diff --git a/lib/Serialization/ASTReaderDecl.cpp b/lib/Serialization/ASTReaderDecl.cpp
index 6788d9ee5c..863aabb173 100644
--- a/lib/Serialization/ASTReaderDecl.cpp
+++ b/lib/Serialization/ASTReaderDecl.cpp
@@ -677,6 +677,10 @@ void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
// Read the definition.
ID->allocateDefinitionData();
+ // Set the definition data of the canonical declaration, so other
+ // redeclarations will see it.
+ ID->getCanonicalDecl()->Data = ID->Data;
+
ObjCInterfaceDecl::DefinitionData &Data = ID->data();
// Read the superclass.
@@ -722,8 +726,8 @@ void ASTDeclReader::VisitObjCInterfaceDecl(ObjCInterfaceDecl *ID) {
// Note that we have deserialized a definition.
Reader.PendingDefinitions.insert(ID);
- } else if (Def && Def->Data) {
- ID->Data = Def->Data;
+ } else {
+ ID->Data = ID->getCanonicalDecl()->Data;
}
}
@@ -746,6 +750,10 @@ void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
// Read the definition.
PD->allocateDefinitionData();
+ // Set the definition data of the canonical declaration, so other
+ // redeclarations will see it.
+ PD->getCanonicalDecl()->Data = PD->Data;
+
unsigned NumProtoRefs = Record[Idx++];
SmallVector<ObjCProtocolDecl *, 16> ProtoRefs;
ProtoRefs.reserve(NumProtoRefs);
@@ -760,8 +768,8 @@ void ASTDeclReader::VisitObjCProtocolDecl(ObjCProtocolDecl *PD) {
// Note that we have deserialized a definition.
Reader.PendingDefinitions.insert(PD);
- } else if (Def && Def->Data) {
- PD->Data = Def->Data;
+ } else {
+ PD->Data = PD->getCanonicalDecl()->Data;
}
}
@@ -1104,12 +1112,21 @@ void ASTDeclReader::InitializeCXXDefinitionData(CXXRecordDecl *D,
if (D == DefinitionDecl) {
D->DefinitionData = new (C) struct CXXRecordDecl::DefinitionData(D);
+
+ // Propagate the DefinitionData pointer to the canonical declaration, so
+ // that all other deserialized declarations will see it.
+ // FIXME: Complain if there already is a DefinitionData!
+ D->getCanonicalDecl()->DefinitionData = D->DefinitionData;
+
ReadCXXDefinitionData(*D->DefinitionData, Record, Idx);
- // Note that we have deserialized a definition.
+ // Note that we have deserialized a definition. Any declarations
+ // deserialized before this one will be be given the DefinitionData pointer
+ // at the end.
Reader.PendingDefinitions.insert(D);
- } else if (DefinitionDecl && DefinitionDecl->DefinitionData) {
- D->DefinitionData = DefinitionDecl->DefinitionData;
+ } else {
+ // Propagate DefinitionData pointer from the canonical declaration.
+ D->DefinitionData = D->getCanonicalDecl()->DefinitionData;
}
}
@@ -1514,8 +1531,6 @@ void ASTDeclReader::mergeRedeclarable(Redeclarable<T> *D,
static_cast<NamespaceDecl *>(static_cast<void*>(ExistingCanon)));
}
- // FIXME: Update common pointer for RedeclarableTemplateDecls?
-
// Don't introduce DCanon into the set of pending declaration chains.
Redecl.suppress();
@@ -2372,15 +2387,6 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile,
unsigned Idx = 0;
while (Idx < Record.size()) {
switch ((DeclUpdateKind)Record[Idx++]) {
- case UPD_CXX_SET_DEFINITIONDATA: {
- CXXRecordDecl *RD = cast<CXXRecordDecl>(D);
- CXXRecordDecl *DefinitionDecl
- = Reader.ReadDeclAs<CXXRecordDecl>(ModuleFile, Record, Idx);
- assert(!RD->DefinitionData && "DefinitionData is already set!");
- InitializeCXXDefinitionData(RD, DefinitionDecl, Record, Idx);
- break;
- }
-
case UPD_CXX_ADDED_IMPLICIT_MEMBER:
cast<CXXRecordDecl>(D)->addedMember(Reader.ReadDecl(ModuleFile, Record, Idx));
break;
@@ -2410,24 +2416,6 @@ void ASTDeclReader::UpdateDecl(Decl *D, ModuleFile &ModuleFile,
cast<VarDecl>(D)->getMemberSpecializationInfo()->setPointOfInstantiation(
Reader.ReadSourceLocation(ModuleFile, Record, Idx));
break;
-
- case UPD_OBJC_SET_CLASS_DEFINITIONDATA: {
- ObjCInterfaceDecl *ID = cast<ObjCInterfaceDecl>(D);
- ObjCInterfaceDecl *Def
- = Reader.ReadDeclAs<ObjCInterfaceDecl>(ModuleFile, Record, Idx);
- if (Def->Data)
- ID->Data = Def->Data;
- break;
- }
-
- case UPD_OBJC_SET_PROTOCOL_DEFINITIONDATA: {
- ObjCProtocolDecl *ID = cast<ObjCProtocolDecl>(D);
- ObjCProtocolDecl *Def
- = Reader.ReadDeclAs<ObjCProtocolDecl>(ModuleFile, Record, Idx);
- if (Def->Data)
- ID->Data = Def->Data;
- break;
- }
}
}
}
diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp
index d49e7110c3..20420d6ddc 100644
--- a/lib/Serialization/ASTWriter.cpp
+++ b/lib/Serialization/ASTWriter.cpp
@@ -3519,12 +3519,9 @@ void ASTWriter::ResolveDeclUpdatesBlocks() {
unsigned Idx = 0, N = URec.size();
while (Idx < N) {
switch ((DeclUpdateKind)URec[Idx++]) {
- case UPD_CXX_SET_DEFINITIONDATA:
case UPD_CXX_ADDED_IMPLICIT_MEMBER:
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;
@@ -4365,22 +4362,6 @@ void ASTWriter::CompletedTagDefinition(const TagDecl *D) {
// have created a new definition decl instead ?
RewriteDecl(RD);
}
-
- for (CXXRecordDecl::redecl_iterator
- I = RD->redecls_begin(), E = RD->redecls_end(); I != E; ++I) {
- CXXRecordDecl *Redecl = cast<CXXRecordDecl>(*I);
- if (Redecl == RD)
- continue;
-
- // We are interested when a PCH decl is modified.
- if (Redecl->isFromASTFile()) {
- UpdateRecord &Record = DeclUpdates[Redecl];
- Record.push_back(UPD_CXX_SET_DEFINITIONDATA);
- assert(Redecl->DefinitionData);
- assert(Redecl->DefinitionData->Definition == D);
- Record.push_back(reinterpret_cast<uint64_t>(D)); // the DefinitionDecl
- }
- }
}
}
void ASTWriter::AddedVisibleDecl(const DeclContext *DC, const Decl *D) {
@@ -4474,45 +4455,6 @@ void ASTWriter::AddedObjCCategoryToInterface(const ObjCCategoryDecl *CatD,
LocalChainedObjCCategories.push_back(Data);
}
-void ASTWriter::CompletedObjCForwardRef(const ObjCContainerDecl *D) {
- assert(!WritingAST && "Already writing the AST!");
-
- 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
- }
- }
- }
-
- 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,
const ObjCPropertyDecl *OrigProp,
diff --git a/test/Modules/Inputs/redecl-merge-left-left.h b/test/Modules/Inputs/redecl-merge-left-left.h
index 612608159b..79c4d620be 100644
--- a/test/Modules/Inputs/redecl-merge-left-left.h
+++ b/test/Modules/Inputs/redecl-merge-left-left.h
@@ -3,3 +3,5 @@
@class C4;
void accept_a_C4(C4*);
+@class ClassWithDef;
+
diff --git a/test/Modules/Inputs/redecl-merge-right.h b/test/Modules/Inputs/redecl-merge-right.h
index 86a3993bc4..113ff22174 100644
--- a/test/Modules/Inputs/redecl-merge-right.h
+++ b/test/Modules/Inputs/redecl-merge-right.h
@@ -88,3 +88,7 @@ public:
int ONE;
@import redecl_merge_top.Explicit;
const int one = ONE;
+
+@interface ClassWithDef
+- (void)method;
+@end
diff --git a/test/Modules/redecl-merge.m b/test/Modules/redecl-merge.m
index cb44a13d18..591c4a29a9 100644
--- a/test/Modules/redecl-merge.m
+++ b/test/Modules/redecl-merge.m
@@ -110,6 +110,9 @@ void test_C3(C3 *c3) {
}
C4 *global_C4;
+
+ClassWithDef *cwd1;
+
@import redecl_merge_left_left;
void test_C4a(C4 *c4) {
@@ -117,6 +120,10 @@ void test_C4a(C4 *c4) {
accept_a_C4(c4);
}
+void test_ClassWithDef(ClassWithDef *cwd) {
+ [cwd method];
+}
+
@import redecl_merge_bottom;
void test_C4b() {