@@ -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
36083608Decl *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 }
0 commit comments