MitalAshok created this revision. Herald added a project: All. MitalAshok added reviewers: akyrtzi, aaron.ballman, erichkeane, browneee. MitalAshok published this revision for review. MitalAshok added a project: LLVM. MitalAshok added a comment. Herald added a project: clang. Herald added a subscriber: cfe-commits.
VarTemplateSpecializationDecl held a TemplateArgumentListInfo which holds a SmallVector<TemplateArgumentLoc, 8>, so in this test case https://github.com/llvm/llvm-project/blob/ee1cf1f64519c815025d962bdf9c9bb3d09d7699/clang/test/SemaCXX/has_unique_object_reps_bitint.cpp#L27 where there was a variable template with more than 8 template arguments, it leaked Replace TemplateArgumentListInfo with ASTTemplateArgumentListInfo and convert between them in some places Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D126937 Files: clang/include/clang/AST/DeclTemplate.h clang/include/clang/Sema/Template.h clang/lib/AST/DeclTemplate.cpp clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
Index: clang/lib/Sema/SemaTemplateInstantiateDecl.cpp =================================================================== --- clang/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ clang/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -3801,7 +3801,7 @@ return nullptr; // Substitute the current template arguments. - const TemplateArgumentListInfo &TemplateArgsInfo = D->getTemplateArgsInfo(); + const ASTTemplateArgumentListInfo &TemplateArgsInfo = D->getTemplateArgsInfo(); VarTemplateArgsInfo.setLAngleLoc(TemplateArgsInfo.getLAngleLoc()); VarTemplateArgsInfo.setRAngleLoc(TemplateArgsInfo.getRAngleLoc()); @@ -3831,12 +3831,13 @@ return nullptr; return VisitVarTemplateSpecializationDecl( - InstVarTemplate, D, VarTemplateArgsInfo, Converted, PrevDecl); + InstVarTemplate, D, + *ASTTemplateArgumentListInfo::Create(D->getASTContext(), VarTemplateArgsInfo), Converted, PrevDecl); } Decl *TemplateDeclInstantiator::VisitVarTemplateSpecializationDecl( VarTemplateDecl *VarTemplate, VarDecl *D, - const TemplateArgumentListInfo &TemplateArgsInfo, + const ASTTemplateArgumentListInfo &TemplateArgsInfo, ArrayRef<TemplateArgument> Converted, VarTemplateSpecializationDecl *PrevDecl) { @@ -5133,7 +5134,9 @@ return cast_or_null<VarTemplateSpecializationDecl>( Instantiator.VisitVarTemplateSpecializationDecl( - VarTemplate, FromVar, TemplateArgsInfo, Converted)); + VarTemplate, FromVar, + *ASTTemplateArgumentListInfo::Create(getASTContext(), TemplateArgsInfo), + Converted)); } /// Instantiates a variable template specialization by completing it Index: clang/lib/AST/DeclTemplate.cpp =================================================================== --- clang/lib/AST/DeclTemplate.cpp +++ clang/lib/AST/DeclTemplate.cpp @@ -1335,10 +1335,12 @@ void VarTemplateSpecializationDecl::setTemplateArgsInfo( const TemplateArgumentListInfo &ArgsInfo) { - TemplateArgsInfo.setLAngleLoc(ArgsInfo.getLAngleLoc()); - TemplateArgsInfo.setRAngleLoc(ArgsInfo.getRAngleLoc()); - for (const TemplateArgumentLoc &Loc : ArgsInfo.arguments()) - TemplateArgsInfo.addArgument(Loc); + TemplateArgsInfo = ASTTemplateArgumentListInfo::Create(getASTContext(), ArgsInfo); +} + +void VarTemplateSpecializationDecl::setTemplateArgsInfo( + const ASTTemplateArgumentListInfo &ArgsInfo) { + TemplateArgsInfo = &ArgsInfo; } //===----------------------------------------------------------------------===// Index: clang/include/clang/Sema/Template.h =================================================================== --- clang/include/clang/Sema/Template.h +++ clang/include/clang/Sema/Template.h @@ -603,7 +603,7 @@ Decl *VisitVarTemplateSpecializationDecl( VarTemplateDecl *VarTemplate, VarDecl *FromVar, - const TemplateArgumentListInfo &TemplateArgsInfo, + const ASTTemplateArgumentListInfo &TemplateArgsInfo, ArrayRef<TemplateArgument> Converted, VarTemplateSpecializationDecl *PrevDecl = nullptr); Index: clang/include/clang/AST/DeclTemplate.h =================================================================== --- clang/include/clang/AST/DeclTemplate.h +++ clang/include/clang/AST/DeclTemplate.h @@ -2718,7 +2718,7 @@ /// The template arguments used to describe this specialization. const TemplateArgumentList *TemplateArgs; - TemplateArgumentListInfo TemplateArgsInfo; + const ASTTemplateArgumentListInfo *TemplateArgsInfo; /// The point where this template was instantiated (if any). SourceLocation PointOfInstantiation; @@ -2773,9 +2773,12 @@ // TODO: Always set this when creating the new specialization? void setTemplateArgsInfo(const TemplateArgumentListInfo &ArgsInfo); + void setTemplateArgsInfo(const ASTTemplateArgumentListInfo &ArgsInfo); - const TemplateArgumentListInfo &getTemplateArgsInfo() const { - return TemplateArgsInfo; + const ASTTemplateArgumentListInfo &getTemplateArgsInfo() const { + assert(TemplateArgsInfo && + "Called getTemplateArgsInfo before setTemplateArgsInfo!"); + return *TemplateArgsInfo; } /// Determine the kind of specialization that this
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits