diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h index 03d5b778d26bf..3677335fa176f 100644 --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -117,6 +117,8 @@ class TemplateParameterList final SourceLocation RAngleLoc, Expr *RequiresClause); + void Profile(llvm::FoldingSetNodeID &ID, const ASTContext &C) const; + /// Iterates through the template parameters in this list. using iterator = NamedDecl **; @@ -616,7 +618,7 @@ class FunctionTemplateSpecializationInfo final static void Profile(llvm::FoldingSetNodeID &ID, ArrayRef TemplateArgs, - ASTContext &Context) { + const ASTContext &Context) { ID.AddInteger(TemplateArgs.size()); for (const TemplateArgument &TemplateArg : TemplateArgs) TemplateArg.Profile(ID, Context); @@ -2081,7 +2083,7 @@ class ClassTemplateSpecializationDecl static void Profile(llvm::FoldingSetNodeID &ID, ArrayRef TemplateArgs, - ASTContext &Context) { + const ASTContext &Context) { ID.AddInteger(TemplateArgs.size()); for (const TemplateArgument &TemplateArg : TemplateArgs) TemplateArg.Profile(ID, Context); @@ -2257,7 +2259,7 @@ class ClassTemplatePartialSpecializationDecl static void Profile(llvm::FoldingSetNodeID &ID, ArrayRef TemplateArgs, - TemplateParameterList *TPL, ASTContext &Context); + TemplateParameterList *TPL, const ASTContext &Context); static bool classof(const Decl *D) { return classofKind(D->getKind()); } @@ -2934,7 +2936,7 @@ class VarTemplateSpecializationDecl : public VarDecl, static void Profile(llvm::FoldingSetNodeID &ID, ArrayRef TemplateArgs, - ASTContext &Context) { + const ASTContext &Context) { ID.AddInteger(TemplateArgs.size()); for (const TemplateArgument &TemplateArg : TemplateArgs) TemplateArg.Profile(ID, Context); @@ -3094,7 +3096,7 @@ class VarTemplatePartialSpecializationDecl static void Profile(llvm::FoldingSetNodeID &ID, ArrayRef TemplateArgs, - TemplateParameterList *TPL, ASTContext &Context); + TemplateParameterList *TPL, const ASTContext &Context); static bool classof(const Decl *D) { return classofKind(D->getKind()); } diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 77dfd58fdd324..fd4c8eafc1c38 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -127,6 +127,39 @@ TemplateParameterList::Create(const ASTContext &C, SourceLocation TemplateLoc, RAngleLoc, RequiresClause); } +void TemplateParameterList::Profile(llvm::FoldingSetNodeID &ID, + const ASTContext &C) const { + const Expr *RC = getRequiresClause(); + ID.AddBoolean(RC != nullptr); + if (RC) + RC->Profile(ID, C, /*Canonical=*/true); + ID.AddInteger(size()); + for (NamedDecl *D : *this) { + if (const auto *NTTP = dyn_cast(D)) { + ID.AddInteger(0); + ID.AddBoolean(NTTP->isParameterPack()); + NTTP->getType().getCanonicalType().Profile(ID); + ID.AddBoolean(NTTP->hasPlaceholderTypeConstraint()); + if (const Expr *E = NTTP->getPlaceholderTypeConstraint()) + E->Profile(ID, C, /*Canonical=*/true); + continue; + } + if (const auto *TTP = dyn_cast(D)) { + ID.AddInteger(1); + ID.AddBoolean(TTP->isParameterPack()); + ID.AddBoolean(TTP->hasTypeConstraint()); + if (const TypeConstraint *TC = TTP->getTypeConstraint()) + TC->getImmediatelyDeclaredConstraint()->Profile(ID, C, + /*Canonical=*/true); + continue; + } + const auto *TTP = cast(D); + ID.AddInteger(2); + ID.AddBoolean(TTP->isParameterPack()); + TTP->getTemplateParameters()->Profile(ID, C); + } +} + unsigned TemplateParameterList::getMinRequiredArguments() const { unsigned NumRequiredArgs = 0; for (const NamedDecl *P : asArray()) { @@ -517,47 +550,13 @@ ClassTemplateDecl::findPartialSpecialization( TPL); } -static void ProfileTemplateParameterList(ASTContext &C, - llvm::FoldingSetNodeID &ID, const TemplateParameterList *TPL) { - const Expr *RC = TPL->getRequiresClause(); - ID.AddBoolean(RC != nullptr); - if (RC) - RC->Profile(ID, C, /*Canonical=*/true); - ID.AddInteger(TPL->size()); - for (NamedDecl *D : *TPL) { - if (const auto *NTTP = dyn_cast(D)) { - ID.AddInteger(0); - ID.AddBoolean(NTTP->isParameterPack()); - NTTP->getType().getCanonicalType().Profile(ID); - ID.AddBoolean(NTTP->hasPlaceholderTypeConstraint()); - if (const Expr *E = NTTP->getPlaceholderTypeConstraint()) - E->Profile(ID, C, /*Canonical=*/true); - continue; - } - if (const auto *TTP = dyn_cast(D)) { - ID.AddInteger(1); - ID.AddBoolean(TTP->isParameterPack()); - ID.AddBoolean(TTP->hasTypeConstraint()); - if (const TypeConstraint *TC = TTP->getTypeConstraint()) - TC->getImmediatelyDeclaredConstraint()->Profile(ID, C, - /*Canonical=*/true); - continue; - } - const auto *TTP = cast(D); - ID.AddInteger(2); - ID.AddBoolean(TTP->isParameterPack()); - ProfileTemplateParameterList(C, ID, TTP->getTemplateParameters()); - } -} - -void -ClassTemplatePartialSpecializationDecl::Profile(llvm::FoldingSetNodeID &ID, - ArrayRef TemplateArgs, TemplateParameterList *TPL, - ASTContext &Context) { +void ClassTemplatePartialSpecializationDecl::Profile( + llvm::FoldingSetNodeID &ID, ArrayRef TemplateArgs, + TemplateParameterList *TPL, const ASTContext &Context) { ID.AddInteger(TemplateArgs.size()); for (const TemplateArgument &TemplateArg : TemplateArgs) TemplateArg.Profile(ID, Context); - ProfileTemplateParameterList(Context, ID, TPL); + TPL->Profile(ID, Context); } void ClassTemplateDecl::AddPartialSpecialization( @@ -1283,14 +1282,13 @@ VarTemplateDecl::findPartialSpecialization(ArrayRef Args, TPL); } -void -VarTemplatePartialSpecializationDecl::Profile(llvm::FoldingSetNodeID &ID, - ArrayRef TemplateArgs, TemplateParameterList *TPL, - ASTContext &Context) { +void VarTemplatePartialSpecializationDecl::Profile( + llvm::FoldingSetNodeID &ID, ArrayRef TemplateArgs, + TemplateParameterList *TPL, const ASTContext &Context) { ID.AddInteger(TemplateArgs.size()); for (const TemplateArgument &TemplateArg : TemplateArgs) TemplateArg.Profile(ID, Context); - ProfileTemplateParameterList(Context, ID, TPL); + TPL->Profile(ID, Context); } void VarTemplateDecl::AddPartialSpecialization(