Skip to content

Commit 8ac7095

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)
1 parent bbe6cbb commit 8ac7095

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
@@ -9123,7 +9123,7 @@ class Sema final {
91239123
const TemplateArgumentList &TemplateArgList,
91249124
const TemplateArgumentListInfo &TemplateArgsInfo,
91259125
SmallVectorImpl<TemplateArgument> &Converted,
9126-
SourceLocation PointOfInstantiation, void *InsertPos,
9126+
SourceLocation PointOfInstantiation,
91279127
LateInstantiatedAttrVec *LateAttrs = nullptr,
91289128
LocalInstantiationScope *StartingScope = nullptr);
91299129
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
@@ -4471,7 +4471,7 @@ Sema::CheckVarTemplateId(VarTemplateDecl *Template, SourceLocation TemplateLoc,
44714471
// FIXME: LateAttrs et al.?
44724472
VarTemplateSpecializationDecl *Decl = BuildVarTemplateInstantiation(
44734473
Template, InstantiationPattern, *InstantiationArgs, TemplateArgs,
4474-
Converted, TemplateNameLoc, InsertPos /*, LateAttrs, StartingScope*/);
4474+
Converted, TemplateNameLoc /*, LateAttrs, StartingScope*/);
44754475
if (!Decl)
44764476
return true;
44774477

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

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

36043604
return VisitVarTemplateSpecializationDecl(
3605-
InstVarTemplate, D, InsertPos, VarTemplateArgsInfo, Converted, PrevDecl);
3605+
InstVarTemplate, D, VarTemplateArgsInfo, Converted, PrevDecl);
36063606
}
36073607

36083608
Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
3609-
VarTemplateDecl *VarTemplate, VarDecl *D, void *InsertPos,
3609+
VarTemplateDecl *VarTemplate, VarDecl *D,
36103610
const TemplateArgumentListInfo &TemplateArgsInfo,
36113611
ArrayRef<TemplateArgument> Converted,
36123612
VarTemplateSpecializationDecl *PrevDecl) {
@@ -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);
@@ -4839,7 +4842,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
48394842
const TemplateArgumentList &TemplateArgList,
48404843
const TemplateArgumentListInfo &TemplateArgsInfo,
48414844
SmallVectorImpl<TemplateArgument> &Converted,
4842-
SourceLocation PointOfInstantiation, void *InsertPos,
4845+
SourceLocation PointOfInstantiation,
48434846
LateInstantiatedAttrVec *LateAttrs,
48444847
LocalInstantiationScope *StartingScope) {
48454848
if (FromVar->isInvalidDecl())
@@ -4878,7 +4881,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
48784881

48794882
return cast_or_null<VarTemplateSpecializationDecl>(
48804883
Instantiator.VisitVarTemplateSpecializationDecl(
4881-
VarTemplate, FromVar, InsertPos, TemplateArgsInfo, Converted));
4884+
VarTemplate, FromVar, TemplateArgsInfo, Converted));
48824885
}
48834886

48844887
/// Instantiates a variable template specialization by completing it
@@ -5310,8 +5313,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
53105313
TemplateDeclInstantiator Instantiator(*this, Var->getDeclContext(),
53115314
TemplateArgs);
53125315
Var = cast_or_null<VarDecl>(Instantiator.VisitVarTemplateSpecializationDecl(
5313-
VarSpec->getSpecializedTemplate(), Def, nullptr,
5314-
VarSpec->getTemplateArgsInfo(), VarSpec->getTemplateArgs().asArray()));
5316+
VarSpec->getSpecializedTemplate(), Def, VarSpec->getTemplateArgsInfo(),
5317+
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)