Skip to content

Commit fc23bc9

Browse files
bcardosolopeststellar
authored andcommitted
[SemaTemplate] Stop passing insertion position around during VarTemplate instantiation
They can get stale at use time because of updates from other recursive specializations. Instead, rely on the existence of previous declarations to add the specialization. Differential Revision: https://reviews.llvm.org/D87853 (cherry picked from commit cffb0dd) This is a re-commit of 8ac7095 with some modifications to avoid changing the clang API.
1 parent ca8de9a commit fc23bc9

File tree

2 files changed

+12
-8
lines changed

2 files changed

+12
-8
lines changed

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3629,8 +3629,11 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
36293629
SemaRef.Context, Owner, D->getInnerLocStart(), D->getLocation(),
36303630
VarTemplate, DI->getType(), DI, D->getStorageClass(), Converted);
36313631
Var->setTemplateArgsInfo(TemplateArgsInfo);
3632-
if (InsertPos)
3632+
if (!PrevDecl) {
3633+
void *InsertPos = nullptr;
3634+
VarTemplate->findSpecialization(Converted, InsertPos);
36333635
VarTemplate->AddSpecialization(Var, InsertPos);
3636+
}
36343637

36353638
if (SemaRef.getLangOpts().OpenCL)
36363639
SemaRef.deduceOpenCLAddressSpace(Var);
@@ -5311,7 +5314,7 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
53115314
TemplateArgs);
53125315
Var = cast_or_null<VarDecl>(Instantiator.VisitVarTemplateSpecializationDecl(
53135316
VarSpec->getSpecializedTemplate(), Def, nullptr,
5314-
VarSpec->getTemplateArgsInfo(), VarSpec->getTemplateArgs().asArray()));
5317+
VarSpec->getTemplateArgsInfo(), VarSpec->getTemplateArgs().asArray(), VarSpec));
53155318
if (Var) {
53165319
llvm::PointerUnion<VarTemplateDecl *,
53175320
VarTemplatePartialSpecializationDecl *> PatternPtr =
@@ -5321,12 +5324,6 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
53215324
cast<VarTemplateSpecializationDecl>(Var)->setInstantiationOf(
53225325
Partial, &VarSpec->getTemplateInstantiationArgs());
53235326

5324-
// Merge the definition with the declaration.
5325-
LookupResult R(*this, Var->getDeclName(), Var->getLocation(),
5326-
LookupOrdinaryName, forRedeclarationInCurContext());
5327-
R.addDecl(OldVar);
5328-
MergeVarDecl(Var, R);
5329-
53305327
// Attach the initializer.
53315328
InstantiateVariableInitializer(Var, Def, TemplateArgs);
53325329
}

clang/test/SemaTemplate/instantiate-var-template.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,10 @@ namespace PR24483 {
4040
template<typename... T> A<T...> models;
4141
template<> struct B models<>; // expected-error {{incomplete type 'struct B'}} expected-note {{forward declaration}}
4242
}
43+
44+
namespace InvalidInsertPos {
45+
template<typename T, int N> T v;
46+
template<int N> decltype(v<int, N-1>) v<int, N>;
47+
template<> int v<int, 0>;
48+
int k = v<int, 500>;
49+
}

0 commit comments

Comments
 (0)