@@ -3602,11 +3602,11 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
3602
3602
return nullptr ;
3603
3603
3604
3604
return VisitVarTemplateSpecializationDecl (
3605
- InstVarTemplate, D, VarTemplateArgsInfo, Converted, PrevDecl);
3605
+ InstVarTemplate, D, InsertPos, VarTemplateArgsInfo, Converted, PrevDecl);
3606
3606
}
3607
3607
3608
3608
Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl (
3609
- VarTemplateDecl *VarTemplate, VarDecl *D,
3609
+ VarTemplateDecl *VarTemplate, VarDecl *D, void *InsertPos,
3610
3610
const TemplateArgumentListInfo &TemplateArgsInfo,
3611
3611
ArrayRef<TemplateArgument> Converted,
3612
3612
VarTemplateSpecializationDecl *PrevDecl) {
@@ -3629,11 +3629,8 @@ Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl(
3629
3629
SemaRef.Context , Owner, D->getInnerLocStart (), D->getLocation (),
3630
3630
VarTemplate, DI->getType (), DI, D->getStorageClass (), Converted);
3631
3631
Var->setTemplateArgsInfo (TemplateArgsInfo);
3632
- if (!PrevDecl) {
3633
- void *InsertPos = nullptr ;
3634
- VarTemplate->findSpecialization (Converted, InsertPos);
3632
+ if (InsertPos)
3635
3633
VarTemplate->AddSpecialization (Var, InsertPos);
3636
- }
3637
3634
3638
3635
if (SemaRef.getLangOpts ().OpenCL )
3639
3636
SemaRef.deduceOpenCLAddressSpace (Var);
@@ -4842,7 +4839,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
4842
4839
const TemplateArgumentList &TemplateArgList,
4843
4840
const TemplateArgumentListInfo &TemplateArgsInfo,
4844
4841
SmallVectorImpl<TemplateArgument> &Converted,
4845
- SourceLocation PointOfInstantiation,
4842
+ SourceLocation PointOfInstantiation, void *InsertPos,
4846
4843
LateInstantiatedAttrVec *LateAttrs,
4847
4844
LocalInstantiationScope *StartingScope) {
4848
4845
if (FromVar->isInvalidDecl ())
@@ -4881,7 +4878,7 @@ VarTemplateSpecializationDecl *Sema::BuildVarTemplateInstantiation(
4881
4878
4882
4879
return cast_or_null<VarTemplateSpecializationDecl>(
4883
4880
Instantiator.VisitVarTemplateSpecializationDecl (
4884
- VarTemplate, FromVar, TemplateArgsInfo, Converted));
4881
+ VarTemplate, FromVar, InsertPos, TemplateArgsInfo, Converted));
4885
4882
}
4886
4883
4887
4884
// / Instantiates a variable template specialization by completing it
@@ -5313,8 +5310,8 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
5313
5310
TemplateDeclInstantiator Instantiator (*this , Var->getDeclContext (),
5314
5311
TemplateArgs);
5315
5312
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 ()));
5318
5315
if (Var) {
5319
5316
llvm::PointerUnion<VarTemplateDecl *,
5320
5317
VarTemplatePartialSpecializationDecl *> PatternPtr =
@@ -5324,6 +5321,12 @@ void Sema::InstantiateVariableDefinition(SourceLocation PointOfInstantiation,
5324
5321
cast<VarTemplateSpecializationDecl>(Var)->setInstantiationOf (
5325
5322
Partial, &VarSpec->getTemplateInstantiationArgs ());
5326
5323
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
+
5327
5330
// Attach the initializer.
5328
5331
InstantiateVariableInitializer (Var, Def, TemplateArgs);
5329
5332
}
0 commit comments