diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-11-14 07:07:59 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2011-11-14 07:07:59 +0000 |
commit | 7d268c3b8ba5d1a23f48bcd9e8d88b051a7fcbdd (patch) | |
tree | 91cb8983f9d450b1a0a7069e9b7c97c5d4ecee00 /clang/lib/Serialization | |
parent | 2432d81ee4d499fd69757340acbb1d9a27ccc10c (diff) | |
download | bcm5719-llvm-7d268c3b8ba5d1a23f48bcd9e8d88b051a7fcbdd.tar.gz bcm5719-llvm-7d268c3b8ba5d1a23f48bcd9e8d88b051a7fcbdd.zip |
[PCH] Load the chained objc categories only after recursive loading is finished
otherwise we may crash.
llvm-svn: 144524
Diffstat (limited to 'clang/lib/Serialization')
-rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 8 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 6 |
2 files changed, 12 insertions, 2 deletions
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 80b582e246d..6192fb77517 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -5543,6 +5543,14 @@ void ASTReader::FinishedDeserializing() { PendingPreviousDecls.pop_front(); } + for (std::vector<std::pair<ObjCInterfaceDecl *, + serialization::DeclID> >::iterator + I = PendingChainedObjCCategories.begin(), + E = PendingChainedObjCCategories.end(); I != E; ++I) { + loadObjCChainedCategories(I->second, I->first); + } + PendingChainedObjCCategories.clear(); + // We are not in recursive loading, so it's safe to pass the "interesting" // decls to the consumer. if (Consumer) diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 729cde0abfb..719f5bc06e1 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -1772,9 +1772,11 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) { // Load any relevant update records. loadDeclUpdateRecords(ID, D); - + + // Load the category chain after recursive loading is finished. if (ObjCChainedCategoriesInterfaces.count(ID)) - loadObjCChainedCategories(ID, cast<ObjCInterfaceDecl>(D)); + PendingChainedObjCCategories.push_back( + std::make_pair(cast<ObjCInterfaceDecl>(D), ID)); // If we have deserialized a declaration that has a definition the // AST consumer might need to know about, queue it. |