Author: Richard Smith Date: 2020-12-13T22:43:23-08:00 New Revision: abbd57e558b907a7be8adc5a5b9699dd7c23b1af
URL: https://github.com/llvm/llvm-project/commit/abbd57e558b907a7be8adc5a5b9699dd7c23b1af DIFF: https://github.com/llvm/llvm-project/commit/abbd57e558b907a7be8adc5a5b9699dd7c23b1af.diff LOG: Factor out and centralize repeated 'getExpandedPackSize'. Added: Modified: clang/include/clang/AST/DeclTemplate.h clang/lib/AST/DeclTemplate.cpp clang/lib/Sema/SemaTemplate.cpp clang/lib/Sema/SemaTemplateDeduction.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/DeclTemplate.h b/clang/include/clang/AST/DeclTemplate.h index 641647659c17..7fbf6294970e 100644 --- a/clang/include/clang/AST/DeclTemplate.h +++ b/clang/include/clang/AST/DeclTemplate.h @@ -3353,6 +3353,36 @@ inline TemplateDecl *getAsTypeTemplateDecl(Decl *D) { : nullptr; } +/// Check whether the template parameter is a pack expansion, and if so, +/// determine the number of parameters produced by that expansion. For instance: +/// +/// \code +/// template<typename ...Ts> struct A { +/// template<Ts ...NTs, template<Ts> class ...TTs, typename ...Us> struct B; +/// }; +/// \endcode +/// +/// In \c A<int,int>::B, \c NTs and \c TTs have expanded pack size 2, and \c Us +/// is not a pack expansion, so returns an empty Optional. +inline Optional<unsigned> getExpandedPackSize(const NamedDecl *Param) { + if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) { + if (TTP->isExpandedParameterPack()) + return TTP->getNumExpansionParameters(); + } + + if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) { + if (NTTP->isExpandedParameterPack()) + return NTTP->getNumExpansionTypes(); + } + + if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Param)) { + if (TTP->isExpandedParameterPack()) + return TTP->getNumExpansionTemplateParameters(); + } + + return None; +} + } // namespace clang #endif // LLVM_CLANG_AST_DECLTEMPLATE_H diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index 328ceaa63df3..25235c56ec46 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -102,24 +102,10 @@ unsigned TemplateParameterList::getMinRequiredArguments() const { unsigned NumRequiredArgs = 0; for (const NamedDecl *P : asArray()) { if (P->isTemplateParameterPack()) { - if (const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(P)) { - if (NTTP->isExpandedParameterPack()) { - NumRequiredArgs += NTTP->getNumExpansionTypes(); - continue; - } - } else if (const auto *TTP = dyn_cast<TemplateTypeParmDecl>(P)) { - if (TTP->isExpandedParameterPack()) { - NumRequiredArgs += TTP->getNumExpansionParameters(); - continue; - } - } else { - const auto *TP = cast<TemplateTemplateParmDecl>(P); - if (TP->isExpandedParameterPack()) { - NumRequiredArgs += TP->getNumExpansionTemplateParameters(); - continue; - } + if (Optional<unsigned> Expansions = getExpandedPackSize(P)) { + NumRequiredArgs += *Expansions; + continue; } - break; } diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index 4176aa1f458f..70a25fb782e9 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -5588,39 +5588,6 @@ bool Sema::CheckTemplateArgument(NamedDecl *Param, return false; } -/// Check whether the template parameter is a pack expansion, and if so, -/// determine the number of parameters produced by that expansion. For instance: -/// -/// \code -/// template<typename ...Ts> struct A { -/// template<Ts ...NTs, template<Ts> class ...TTs, typename ...Us> struct B; -/// }; -/// \endcode -/// -/// In \c A<int,int>::B, \c NTs and \c TTs have expanded pack size 2, and \c Us -/// is not a pack expansion, so returns an empty Optional. -static Optional<unsigned> getExpandedPackSize(NamedDecl *Param) { - if (TemplateTypeParmDecl *TTP - = dyn_cast<TemplateTypeParmDecl>(Param)) { - if (TTP->isExpandedParameterPack()) - return TTP->getNumExpansionParameters(); - } - - if (NonTypeTemplateParmDecl *NTTP - = dyn_cast<NonTypeTemplateParmDecl>(Param)) { - if (NTTP->isExpandedParameterPack()) - return NTTP->getNumExpansionTypes(); - } - - if (TemplateTemplateParmDecl *TTP - = dyn_cast<TemplateTemplateParmDecl>(Param)) { - if (TTP->isExpandedParameterPack()) - return TTP->getNumExpansionTemplateParameters(); - } - - return None; -} - /// Diagnose a missing template argument. template<typename TemplateParmDecl> static bool diagnoseMissingArgument(Sema &S, SourceLocation Loc, diff --git a/clang/lib/Sema/SemaTemplateDeduction.cpp b/clang/lib/Sema/SemaTemplateDeduction.cpp index d137aec82b8c..4a3b64cf5425 100644 --- a/clang/lib/Sema/SemaTemplateDeduction.cpp +++ b/clang/lib/Sema/SemaTemplateDeduction.cpp @@ -658,23 +658,6 @@ static TemplateParameter makeTemplateParameter(Decl *D) { return TemplateParameter(cast<TemplateTemplateParmDecl>(D)); } -/// If \p Param is an expanded parameter pack, get the number of expansions. -static Optional<unsigned> getExpandedPackSize(NamedDecl *Param) { - if (auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param)) - if (TTP->isExpandedParameterPack()) - return TTP->getNumExpansionParameters(); - - if (auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param)) - if (NTTP->isExpandedParameterPack()) - return NTTP->getNumExpansionTypes(); - - if (auto *TTP = dyn_cast<TemplateTemplateParmDecl>(Param)) - if (TTP->isExpandedParameterPack()) - return TTP->getNumExpansionTemplateParameters(); - - return None; -} - /// A pack that we're currently deducing. struct clang::DeducedPack { // The index of the pack. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits