Skip to content

Commit cffb0dd

Browse files
committed
[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
1 parent 08924b5 commit cffb0dd

File tree

5 files changed

+20
-16
lines changed

5 files changed

+20
-16
lines changed

clang/include/clang/Sema/Sema.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9171,7 +9171,7 @@ class Sema final {
91719171
const TemplateArgumentList &TemplateArgList,
91729172
const TemplateArgumentListInfo &TemplateArgsInfo,
91739173
SmallVectorImpl<TemplateArgument> &Converted,
9174-
SourceLocation PointOfInstantiation, void *InsertPos,
9174+
SourceLocation PointOfInstantiation,
91759175
LateInstantiatedAttrVec *LateAttrs = nullptr,
91769176
LocalInstantiationScope *StartingScope = nullptr);
91779177
VarTemplateSpecializationDecl *CompleteVarTemplateSpecializationDecl(

clang/include/clang/Sema/Template.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -600,7 +600,7 @@ enum class TemplateSubstitutionKind : char {
600600
TagDecl *NewDecl);
601601

602602
Decl *VisitVarTemplateSpecializationDecl(
603-
VarTemplateDecl *VarTemplate, VarDecl *FromVar, void *InsertPos,
603+
VarTemplateDecl *VarTemplate, VarDecl *FromVar,
604604
const TemplateArgumentListInfo &TemplateArgsInfo,
605605
ArrayRef<TemplateArgument> Converted,
606606
VarTemplateSpecializationDecl *PrevDecl = nullptr);

clang/lib/Sema/SemaTemplate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4584,7 +4584,7 @@ Sema::CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc,
45844584
// FIXME: LateAttrs et al.?
45854585
VarTemplateSpecializationDecl *Decl = BuildVarTemplateInstantiation(
45864586
Template, InstantiationPattern, *InstantiationArgs, TemplateArgs,
4587-
Converted, TemplateNameLoc, InsertPos /*, LateAttrs, StartingScope*/);
4587+
Converted, TemplateNameLoc /*, LateAttrs, StartingScope*/);
45884588
if (!Decl)
45894589
return true;
45904590

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3628,11 +3628,11 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
36283628
return nullptr;
36293629

36303630
return VisitVarTemplateSpecializationDecl(
3631-
InstVarTemplate, D, InsertPos, VarTemplateArgsInfo, Converted, PrevDecl);
3631+
InstVarTemplate, D, VarTemplateArgsInfo, Converted, PrevDecl);
36323632
}
36333633

36343634
Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
3635-
VarTemplateDecl *VarTemplate, VarDecl *D, void *InsertPos,
3635+
VarTemplateDecl *VarTemplate, VarDecl *D,
36363636
const TemplateArgumentListInfo &TemplateArgsInfo,
36373637
ArrayRef<TemplateArgument> Converted,
36383638
VarTemplateSpecializationDecl *PrevDecl) {
@@ -3655,8 +3655,11 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
36553655
SemaRef.Context, Owner, D->getInnerLocStart(), D->getLocation(),
36563656
VarTemplate, DI->getType(), DI, D->getStorageClass(), Converted);
36573657
Var->setTemplateArgsInfo(TemplateArgsInfo);
3658-
if (InsertPos)
3658+
if (!PrevDecl) {
3659+
void *InsertPos = nullptr;
3660+
VarTemplate->findSpecialization(Converted, InsertPos);
36593661
VarTemplate->AddSpecialization(Var, InsertPos);
3662+
}
36603663

36613664
if (SemaRef.getLangOpts().OpenCL)
36623665
SemaRef.deduceOpenCLAddressSpace(Var);
@@ -4865,7 +4868,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
48654868
const TemplateArgumentList &TemplateArgList,
48664869
const TemplateArgumentListInfo &TemplateArgsInfo,
48674870
SmallVectorImpl<TemplateArgument> &Converted,
4868-
SourceLocation PointOfInstantiation, void *InsertPos,
4871+
SourceLocation PointOfInstantiation,
48694872
LateInstantiatedAttrVec *LateAttrs,
48704873
LocalInstantiationScope *StartingScope) {
48714874
if (FromVar->isInvalidDecl())
@@ -4904,7 +4907,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
49044907

49054908
return cast_or_null<VarTemplateSpecializationDecl>(
49064909
Instantiator.VisitVarTemplateSpecializationDecl(
4907-
VarTemplate, FromVar, InsertPos, TemplateArgsInfo, Converted));
4910+
VarTemplate, FromVar, TemplateArgsInfo, Converted));
49084911
}
49094912

49104913
/// Instantiates a variable template specialization by completing it
@@ -5327,8 +5330,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
53275330
TemplateDeclInstantiator Instantiator(*this, Var->getDeclContext(),
53285331
TemplateArgs);
53295332
Var = cast_or_null<VarDecl>(Instantiator.VisitVarTemplateSpecializationDecl(
5330-
VarSpec->getSpecializedTemplate(), Def, nullptr,
5331-
VarSpec->getTemplateArgsInfo(), VarSpec->getTemplateArgs().asArray()));
5333+
VarSpec->getSpecializedTemplate(), Def, VarSpec->getTemplateArgsInfo(),
5334+
VarSpec->getTemplateArgs().asArray(), VarSpec));
53325335
if (Var) {
53335336
llvm::PointerUnion<VarTemplateDecl *,
53345337
VarTemplatePartialSpecializationDecl *> PatternPtr =
@@ -5338,12 +5341,6 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
53385341
cast<VarTemplateSpecializationDecl>(Var)->setInstantiationOf(
53395342
Partial, &VarSpec->getTemplateInstantiationArgs());
53405343

5341-
// Merge the definition with the declaration.
5342-
LookupResult R(*this, Var->getDeclName(), Var->getLocation(),
5343-
LookupOrdinaryName, forRedeclarationInCurContext());
5344-
R.addDecl(OldVar);
5345-
MergeVarDecl(Var, R);
5346-
53475344
// Attach the initializer.
53485345
InstantiateVariableInitializer(Var, Def, TemplateArgs);
53495346
}

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)