diff options
author | Anders Carlsson <andersca@mac.com> | 2009-06-13 02:08:00 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-06-13 02:08:00 +0000 |
commit | 0ceffb51b28b09db67404058c642dcb1f877f6e8 (patch) | |
tree | 5ca0ba92098e14baad1e4df08a62989d700cd51d /lib | |
parent | f0ec39a99b543547609a36a1bca08836db7849a6 (diff) |
More work on type parameter packs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@73281 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/DeclTemplate.cpp | 4 | ||||
-rw-r--r-- | lib/Sema/SemaTemplate.cpp | 27 |
2 files changed, 27 insertions, 4 deletions
diff --git a/lib/AST/DeclTemplate.cpp b/lib/AST/DeclTemplate.cpp index 9526b48468..5b1bf9b3af 100644 --- a/lib/AST/DeclTemplate.cpp +++ b/lib/AST/DeclTemplate.cpp @@ -50,7 +50,9 @@ unsigned TemplateParameterList::getMinRequiredArguments() const { ParamBegin = const_cast<TemplateParameterList *>(this)->begin(); while (Param != ParamBegin) { --Param; - if (!(isa<TemplateTypeParmDecl>(*Param) && + + if (!(*Param)->isTemplateParameterPack() && + !(isa<TemplateTypeParmDecl>(*Param) && cast<TemplateTypeParmDecl>(*Param)->hasDefaultArgument()) && !(isa<NonTypeTemplateParmDecl>(*Param) && cast<NonTypeTemplateParmDecl>(*Param)->hasDefaultArgument()) && diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index f20bcd95ca..00d8c769bd 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -1016,7 +1016,10 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template, unsigned NumArgs = NumTemplateArgs; bool Invalid = false; - if (NumArgs > NumParams || + bool HasParameterPack = + NumParams > 0 && Params->getParam(NumParams - 1)->isTemplateParameterPack(); + + if ((NumArgs > NumParams && !HasParameterPack) || NumArgs < Params->getMinRequiredArguments()) { // FIXME: point at either the first arg beyond what we can handle, // or the '>', depending on whether we have too many or too few @@ -1050,6 +1053,13 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template, // Retrieve the default template argument from the template // parameter. if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { + if (TTP->isParameterPack()) { + // We have an empty parameter pack. + Converted.BeginParameterPack(); + Converted.EndParameterPack(); + break; + } + if (!TTP->hasDefaultArgument()) break; @@ -1112,8 +1122,19 @@ bool Sema::CheckTemplateArgumentList(TemplateDecl *Template, if (TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(*Param)) { - if (CheckTemplateTypeArgument(TTP, Arg, Converted)) - Invalid = true; + if (TTP->isParameterPack()) { + Converted.BeginParameterPack(); + // Check all the remaining arguments (if any). + for (; ArgIdx < NumArgs; ++ArgIdx) { + if (CheckTemplateTypeArgument(TTP, TemplateArgs[ArgIdx], Converted)) + Invalid = true; + } + + Converted.EndParameterPack(); + } else { + if (CheckTemplateTypeArgument(TTP, Arg, Converted)) + Invalid = true; + } } else if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(*Param)) { // Check non-type template parameters. |