Skip to content

Commit de0d97c

Browse files
committed
WIP: [llvm-project] Fix lazy template loading
1 parent 35c56bb commit de0d97c

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

Diff for: interpreter/llvm-project/clang/lib/Serialization/ASTReader.cpp

+2-8
Original file line numberDiff line numberDiff line change
@@ -7723,14 +7723,8 @@ void ASTReader::CompleteRedeclChain(const Decl *D) {
77237723
}
77247724
}
77257725

7726-
if (Template) {
7727-
// For partitial specialization, load all the specializations for safety.
7728-
if (isa<ClassTemplatePartialSpecializationDecl,
7729-
VarTemplatePartialSpecializationDecl>(D))
7730-
Template->loadLazySpecializationsImpl();
7731-
else
7732-
Template->loadLazySpecializationsImpl(Args);
7733-
}
7726+
if (Template)
7727+
Template->loadLazySpecializationsImpl(Args);
77347728
}
77357729

77367730
CXXCtorInitializer **

Diff for: interpreter/llvm-project/clang/lib/Serialization/TemplateArgumentHasher.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,21 @@ void TemplateArgumentHasher::AddDecl(const Decl *D) {
196196
}
197197

198198
AddDeclarationName(ND->getDeclName());
199+
200+
// If this was a specialization we should take into account its template
201+
// arguments. This helps to reduce collisions coming when visiting template
202+
// specialization types (eg. when processing type template arguments).
203+
ArrayRef<TemplateArgument> Args;
204+
if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D))
205+
Args = CTSD->getTemplateArgs().asArray();
206+
else if (auto *VTSD = dyn_cast<VarTemplateSpecializationDecl>(D))
207+
Args = VTSD->getTemplateArgs().asArray();
208+
else if (auto *FD = dyn_cast<FunctionDecl>(D))
209+
if (FD->getTemplateSpecializationArgs())
210+
Args = FD->getTemplateSpecializationArgs()->asArray();
211+
212+
for (auto &TA : Args)
213+
AddTemplateArgument(TA);
199214
}
200215

201216
void TemplateArgumentHasher::AddQualType(QualType T) {

0 commit comments

Comments
 (0)