/// Delete expressions to analyze at the end of translation unit.
SmallVector<uint64_t, 8> DelayedDeleteExprs;
- // A list of late parsed template function data.
- SmallVector<uint64_t, 1> LateParsedTemplates;
+ // A list of late parsed template function data with their module files.
+ SmallVector<std::pair<ModuleFile *, SmallVector<uint64_t, 1>>, 4>
+ LateParsedTemplates;
/// The IDs of all decls to be checked for deferred diags.
///
}
case LATE_PARSED_TEMPLATE:
- LateParsedTemplates.append(Record.begin(), Record.end());
+ LateParsedTemplates.emplace_back(
+ std::piecewise_construct, std::forward_as_tuple(&F),
+ std::forward_as_tuple(Record.begin(), Record.end()));
break;
case OPTIMIZE_PRAGMA_OPTIONS:
void ASTReader::ReadLateParsedTemplates(
llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
&LPTMap) {
- for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
- /* In loop */) {
- FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
+ for (auto &LPT : LateParsedTemplates) {
+ ModuleFile *FMod = LPT.first;
+ RecordDataImpl &LateParsed = LPT.second;
+ for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
+ /* In loop */) {
+ FunctionDecl *FD =
+ cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++]));
- auto LT = std::make_unique<LateParsedTemplate>();
- LT->D = GetDecl(LateParsedTemplates[Idx++]);
+ auto LT = std::make_unique<LateParsedTemplate>();
+ 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) {