diff --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h index fb48430e25ce..9dc19458521c 100644 --- a/clang/include/clang/Basic/SourceManager.h +++ b/clang/include/clang/Basic/SourceManager.h @@ -1296,6 +1296,9 @@ private: getDecomposedSpellingLocSlowCase(const SrcMgr::SLocEntry *E, unsigned Offset) const; void computeMacroArgsCache(SrcMgr::ContentCache *Content, FileID FID); + + friend class ASTReader; + friend class ASTWriter; }; diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index e4f9fa693c8a..6c0afb59b40c 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -2633,9 +2633,11 @@ ASTReader::ASTReadResult ASTReader::ReadASTCore(StringRef FileName, // Preload SLocEntries. for (unsigned I = 0, N = M->PreloadSLocEntries.size(); I != N; ++I) { int Index = int(M->PreloadSLocEntries[I] - 1) + F.SLocEntryBaseID; - ASTReadResult Result = ReadSLocEntryRecord(Index); - if (Result != Success) - return Failure; + // Load it through the SourceManager and don't call ReadSLocEntryRecord() + // directly because the entry may have already been loaded in which case + // calling ReadSLocEntryRecord() directly would trigger an assertion in + // SourceManager. + SourceMgr.getLoadedSLocEntryByID(Index); }