Skip to content

Commit d8e8ae1

Browse files
committed
Revert "[SemaTemplate] Stop passing insertion position around during VarTemplate instantiation"
This reverts commit 8ac7095. This commit changes the public API of clang, so it needs to be reworked.
1 parent e4500ba commit d8e8ae1

File tree

5 files changed

+16
-20
lines changed

5 files changed

+16
-20
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,
9126+
SourceLocation PointOfInstantiation, void *InsertPos,
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,
603+
VarTemplateDecl *VarTemplate, VarDecl *FromVar, void *InsertPos,
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 /*, LateAttrs, StartingScope*/);
4474+
Converted, TemplateNameLoc, InsertPos /*, LateAttrs, StartingScope*/);
44754475
if (!Decl)
44764476
return true;
44774477

clang/lib/Sema/SemaTemplateInstantiateDecl.cpp

Lines changed: 13 additions & 10 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, VarTemplateArgsInfo, Converted, PrevDecl);
3605+
InstVarTemplate, D, InsertPos, VarTemplateArgsInfo, Converted, PrevDecl);
36063606
}
36073607

36083608
Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
3609-
VarTemplateDecl *VarTemplate, VarDecl *D,
3609+
VarTemplateDecl *VarTemplate, VarDecl *D, void *InsertPos,
36103610
const TemplateArgumentListInfo &TemplateArgsInfo,
36113611
ArrayRef<TemplateArgument> Converted,
36123612
VarTemplateSpecializationDecl *PrevDecl) {
@@ -3629,11 +3629,8 @@ 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 (!PrevDecl) {
3633-
void *InsertPos = nullptr;
3634-
VarTemplate->findSpecialization(Converted, InsertPos);
3632+
if (InsertPos)
36353633
VarTemplate->AddSpecialization(Var, InsertPos);
3636-
}
36373634

36383635
if (SemaRef.getLangOpts().OpenCL)
36393636
SemaRef.deduceOpenCLAddressSpace(Var);
@@ -4842,7 +4839,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
48424839
const TemplateArgumentList &TemplateArgList,
48434840
const TemplateArgumentListInfo &TemplateArgsInfo,
48444841
SmallVectorImpl<TemplateArgument> &Converted,
4845-
SourceLocation PointOfInstantiation,
4842+
SourceLocation PointOfInstantiation, void *InsertPos,
48464843
LateInstantiatedAttrVec *LateAttrs,
48474844
LocalInstantiationScope *StartingScope) {
48484845
if (FromVar->isInvalidDecl())
@@ -4881,7 +4878,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
48814878

48824879
return cast_or_null<VarTemplateSpecializationDecl>(
48834880
Instantiator.VisitVarTemplateSpecializationDecl(
4884-
VarTemplate, FromVar, TemplateArgsInfo, Converted));
4881+
VarTemplate, FromVar, InsertPos, TemplateArgsInfo, Converted));
48854882
}
48864883

48874884
/// Instantiates a variable template specialization by completing it
@@ -5313,8 +5310,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
53135310
TemplateDeclInstantiator Instantiator(*this, Var->getDeclContext(),
53145311
TemplateArgs);
53155312
Var = cast_or_null<VarDecl>(Instantiator.VisitVarTemplateSpecializationDecl(
5316-
VarSpec->getSpecializedTemplate(), Def, VarSpec->getTemplateArgsInfo(),
5317-
VarSpec->getTemplateArgs().asArray(), VarSpec));
5313+
VarSpec->getSpecializedTemplate(), Def, nullptr,
5314+
VarSpec->getTemplateArgsInfo(), VarSpec->getTemplateArgs().asArray()));
53185315
if (Var) {
53195316
llvm::PointerUnion<VarTemplateDecl *,
53205317
VarTemplatePartialSpecializationDecl *> PatternPtr =
@@ -5324,6 +5321,12 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
53245321
cast<VarTemplateSpecializationDecl>(Var)->setInstantiationOf(
53255322
Partial, &VarSpec->getTemplateInstantiationArgs());
53265323

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+
53275330
// Attach the initializer.
53285331
InstantiateVariableInitializer(Var, Def, TemplateArgs);
53295332
}

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,3 @@ 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)