Index: clang/include/clang/Serialization/ASTReader.h =================================================================== --- clang/include/clang/Serialization/ASTReader.h +++ clang/include/clang/Serialization/ASTReader.h @@ -903,6 +903,10 @@ // A list of late parsed template function data. SmallVector LateParsedTemplates; + // A list of LateParsedTemplates paired with their module files. + llvm::MapVector> + LateParsedTemplatesModulesMap; + /// The IDs of all decls to be checked for deferred diags. /// /// Sema tracks these to emit deferred diags. Index: clang/lib/Serialization/ASTReader.cpp =================================================================== --- clang/lib/Serialization/ASTReader.cpp +++ clang/lib/Serialization/ASTReader.cpp @@ -3721,6 +3721,9 @@ case LATE_PARSED_TEMPLATE: LateParsedTemplates.append(Record.begin(), Record.end()); + LateParsedTemplatesModulesMap.insert( + std::make_pair(&F, std::move(LateParsedTemplates))); + LateParsedTemplates.clear(); break; case OPTIMIZE_PRAGMA_OPTIONS: @@ -8386,25 +8389,28 @@ void ASTReader::ReadLateParsedTemplates( llvm::MapVector> &LPTMap) { - for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N; - /* In loop */) { - FunctionDecl *FD = cast(GetDecl(LateParsedTemplates[Idx++])); + for (auto &LPT : LateParsedTemplatesModulesMap) { + ModuleFile *FMod = LPT.first; + SmallVector LateParsed(LPT.second); + for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; + /* In loop */) { + FunctionDecl *FD = + cast(GetLocalDecl(*FMod, LateParsed[Idx++])); - auto LT = std::make_unique(); - LT->D = GetDecl(LateParsedTemplates[Idx++]); + auto LT = std::make_unique(); + LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]); - ModuleFile *F = getOwningModuleFile(LT->D); - assert(F && "No module"); + ModuleFile *F = getOwningModuleFile(LT->D); + assert(F && "No module"); - unsigned TokN = LateParsedTemplates[Idx++]; - LT->Toks.reserve(TokN); - for (unsigned T = 0; T < TokN; ++T) - LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx)); + unsigned TokN = LateParsed[Idx++]; + LT->Toks.reserve(TokN); + for (unsigned T = 0; T < TokN; ++T) + LT->Toks.push_back(ReadToken(*F, LateParsed, Idx)); - LPTMap.insert(std::make_pair(FD, std::move(LT))); + LPTMap.insert(std::make_pair(FD, std::move(LT))); + } } - - LateParsedTemplates.clear(); } void ASTReader::LoadSelector(Selector Sel) {