diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-05 21:11:38 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-05 21:11:38 +0000 |
commit | 1fe85ea697fb5c85acded3ac0ddbc19f89c2e181 (patch) | |
tree | 5f8a42d98e3f99c1ed0020cce5b8020fe574b788 /lib | |
parent | 135ffa7375fb5802b92f42774e02d0e6e4c78e5b (diff) |
Add Decl::isParameterPack(), which covers both function and template
parameter packs, along with ParmVarDecl::isParameterPack(), which
looks for function parameter packs. Use these routines to fix some
obvious FIXMEs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122904 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/AST/Decl.cpp | 4 | ||||
-rw-r--r-- | lib/AST/DeclBase.cpp | 7 | ||||
-rw-r--r-- | lib/AST/Expr.cpp | 7 | ||||
-rw-r--r-- | lib/Sema/SemaTemplateVariadic.cpp | 6 |
4 files changed, 15 insertions, 9 deletions
diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 5b82ddd7c6..c51d2cdc37 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1221,6 +1221,10 @@ SourceRange ParmVarDecl::getDefaultArgRange() const { return SourceRange(); } +bool ParmVarDecl::isParameterPack() const { + return isa<PackExpansionType>(getType()); +} + //===----------------------------------------------------------------------===// // FunctionDecl Implementation //===----------------------------------------------------------------------===// diff --git a/lib/AST/DeclBase.cpp b/lib/AST/DeclBase.cpp index 700100507b..e16bd22f33 100644 --- a/lib/AST/DeclBase.cpp +++ b/lib/AST/DeclBase.cpp @@ -119,6 +119,13 @@ bool Decl::isTemplateParameterPack() const { return false; } +bool Decl::isParameterPack() const { + if (const ParmVarDecl *Parm = dyn_cast<ParmVarDecl>(this)) + return Parm->isParameterPack(); + + return isTemplateParameterPack(); +} + bool Decl::isFunctionOrFunctionTemplate() const { if (const UsingShadowDecl *UD = dyn_cast<UsingShadowDecl>(this)) return UD->getTargetDecl()->isFunctionOrFunctionTemplate(); diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 3a71883419..c1dc5326e5 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -211,11 +211,8 @@ void DeclRefExpr::computeDependence() { // Determine whether this expression contains any unexpanded parameter // packs. // Is the declaration a parameter pack? - if (NonTypeTemplateParmDecl *NTTP = dyn_cast<NonTypeTemplateParmDecl>(D)) { - if (NTTP->isParameterPack()) - ExprBits.ContainsUnexpandedParameterPack = true; - } - // FIXME: Variadic templates function parameter packs. + if (D->isParameterPack()) + ExprBits.ContainsUnexpandedParameterPack = true; } DeclRefExpr::DeclRefExpr(NestedNameSpecifier *Qualifier, diff --git a/lib/Sema/SemaTemplateVariadic.cpp b/lib/Sema/SemaTemplateVariadic.cpp index fb88bd114b..3090d1532d 100644 --- a/lib/Sema/SemaTemplateVariadic.cpp +++ b/lib/Sema/SemaTemplateVariadic.cpp @@ -602,9 +602,8 @@ ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S, case LookupResult::NotFoundInCurrentInstantiation: if (DeclarationName CorrectedName = CorrectTypo(R, S, 0, 0, false, CTC_NoKeywords)) { - // FIXME: Variadic templates function parameter packs. if (NamedDecl *CorrectedResult = R.getAsSingle<NamedDecl>()) - if (CorrectedResult->isTemplateParameterPack()) { + if (CorrectedResult->isParameterPack()) { ParameterPack = CorrectedResult; Diag(NameLoc, diag::err_sizeof_pack_no_pack_name_suggest) << &Name << CorrectedName @@ -624,8 +623,7 @@ ExprResult Sema::ActOnSizeofParameterPackExpr(Scope *S, return ExprError(); } - // FIXME: Variadic templates function parameter packs. - if (!ParameterPack || !ParameterPack->isTemplateParameterPack()) { + if (!ParameterPack || !ParameterPack->isParameterPack()) { Diag(NameLoc, diag::err_sizeof_pack_no_pack_name) << &Name; return ExprError(); |