From 8871a44ae61cf97ff6fff4c640fadce9ba4cf1b0 Mon Sep 17 00:00:00 2001
From: Argyrios Kyrtzidis <akyrtzi@gmail.com>
Date: Thu, 8 Jul 2010 17:13:02 +0000
Subject: [PATCH] Introduce PCHReader::GetTranslationUnitDecl() and use it
 instead of ReadDeclRecord when initializing.

ReadDeclRecord would hit assertion if the translation unit declaration was already loaded during
IdentifierInfo initialization.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107885 91177308-0d34-0410-b5e6-96231b3b80d8
---
 include/clang/Frontend/PCHReader.h | 3 +++
 lib/Frontend/PCHReader.cpp         | 9 ++++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/include/clang/Frontend/PCHReader.h b/include/clang/Frontend/PCHReader.h
index 9f917391068..3d29fccf8f1 100644
--- a/include/clang/Frontend/PCHReader.h
+++ b/include/clang/Frontend/PCHReader.h
@@ -616,6 +616,9 @@ public:
   TypeSourceInfo *GetTypeSourceInfo(const RecordData &Record,
                                     unsigned &Idx);
 
+  /// \brief Resolve and return the translation unit declaration.
+  TranslationUnitDecl *GetTranslationUnitDecl();
+
   /// \brief Resolve a type ID into a type, potentially building a new
   /// type.
   QualType GetType(pch::TypeID ID);
diff --git a/lib/Frontend/PCHReader.cpp b/lib/Frontend/PCHReader.cpp
index 568d9ce77e6..6acfdb29e4b 100644
--- a/lib/Frontend/PCHReader.cpp
+++ b/lib/Frontend/PCHReader.cpp
@@ -1702,7 +1702,7 @@ void PCHReader::InitializeContext(ASTContext &Ctx) {
   PP->setExternalSource(this);
 
   // Load the translation unit declaration
-  ReadDeclRecord(DeclOffsets[0], 0);
+  GetTranslationUnitDecl();
 
   // Load the special types.
   Context->setBuiltinVaListType(
@@ -2590,6 +2590,13 @@ Decl *PCHReader::GetExternalDecl(uint32_t ID) {
   return GetDecl(ID);
 }
 
+TranslationUnitDecl *PCHReader::GetTranslationUnitDecl() {
+  if (!DeclsLoaded[0])
+    ReadDeclRecord(DeclOffsets[0], 0);
+
+  return cast<TranslationUnitDecl>(DeclsLoaded[0]);
+}
+
 Decl *PCHReader::GetDecl(pch::DeclID ID) {
   if (ID == 0)
     return 0;
-- 
GitLab