Skip to content

Commit b910651

Browse files
author
git apple-llvm automerger
committed
Merge commit '6cf10ced9fb5' from apple/master into swift/master-next
2 parents 38ac10b + 6cf10ce commit b910651

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

clang/include/clang/Serialization/ASTReader.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -893,8 +893,9 @@ class ASTReader
893893
/// Delete expressions to analyze at the end of translation unit.
894894
SmallVector<uint64_t, 8> DelayedDeleteExprs;
895895

896-
// A list of late parsed template function data.
897-
SmallVector<uint64_t, 1> LateParsedTemplates;
896+
// A list of late parsed template function data with their module files.
897+
SmallVector<std::pair<ModuleFile *, SmallVector<uint64_t, 1>>, 4>
898+
LateParsedTemplates;
898899

899900
/// The IDs of all decls to be checked for deferred diags.
900901
///

clang/lib/Serialization/ASTReader.cpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3696,7 +3696,9 @@ ASTReader::ReadASTBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
36963696
}
36973697

36983698
case LATE_PARSED_TEMPLATE:
3699-
LateParsedTemplates.append(Record.begin(), Record.end());
3699+
LateParsedTemplates.emplace_back(
3700+
std::piecewise_construct, std::forward_as_tuple(&F),
3701+
std::forward_as_tuple(Record.begin(), Record.end()));
37003702
break;
37013703

37023704
case OPTIMIZE_PRAGMA_OPTIONS:
@@ -8393,25 +8395,28 @@ void ASTReader::ReadPendingInstantiations(
83938395
void ASTReader::ReadLateParsedTemplates(
83948396
llvm::MapVector<const FunctionDecl *, std::unique_ptr<LateParsedTemplate>>
83958397
&LPTMap) {
8396-
for (unsigned Idx = 0, N = LateParsedTemplates.size(); Idx < N;
8397-
/* In loop */) {
8398-
FunctionDecl *FD = cast<FunctionDecl>(GetDecl(LateParsedTemplates[Idx++]));
8398+
for (auto &LPT : LateParsedTemplates) {
8399+
ModuleFile *FMod = LPT.first;
8400+
RecordDataImpl &LateParsed = LPT.second;
8401+
for (unsigned Idx = 0, N = LateParsed.size(); Idx < N;
8402+
/* In loop */) {
8403+
FunctionDecl *FD =
8404+
cast<FunctionDecl>(GetLocalDecl(*FMod, LateParsed[Idx++]));
83998405

8400-
auto LT = std::make_unique<LateParsedTemplate>();
8401-
LT->D = GetDecl(LateParsedTemplates[Idx++]);
8406+
auto LT = std::make_unique<LateParsedTemplate>();
8407+
LT->D = GetLocalDecl(*FMod, LateParsed[Idx++]);
84028408

8403-
ModuleFile *F = getOwningModuleFile(LT->D);
8404-
assert(F && "No module");
8409+
ModuleFile *F = getOwningModuleFile(LT->D);
8410+
assert(F && "No module");
84058411

8406-
unsigned TokN = LateParsedTemplates[Idx++];
8407-
LT->Toks.reserve(TokN);
8408-
for (unsigned T = 0; T < TokN; ++T)
8409-
LT->Toks.push_back(ReadToken(*F, LateParsedTemplates, Idx));
8412+
unsigned TokN = LateParsed[Idx++];
8413+
LT->Toks.reserve(TokN);
8414+
for (unsigned T = 0; T < TokN; ++T)
8415+
LT->Toks.push_back(ReadToken(*F, LateParsed, Idx));
84108416

8411-
LPTMap.insert(std::make_pair(FD, std::move(LT)));
8417+
LPTMap.insert(std::make_pair(FD, std::move(LT)));
8418+
}
84128419
}
8413-
8414-
LateParsedTemplates.clear();
84158420
}
84168421

84178422
void ASTReader::LoadSelector(Selector Sel) {

0 commit comments

Comments
 (0)