summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/TemplateBase.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2011-01-03 17:17:50 +0000
committerDouglas Gregor <dgregor@apple.com>2011-01-03 17:17:50 +0000
commite8e9dd624c88a05cf0dee727d5555464e6833902 (patch)
treecd6f3ab5b41b3d40f1bd3b79b6d62ca6d136328e /clang/lib/AST/TemplateBase.cpp
parent67cce9b13575240704f0305dcf4f9f0401f05f51 (diff)
downloadbcm5719-llvm-e8e9dd624c88a05cf0dee727d5555464e6833902.tar.gz
bcm5719-llvm-e8e9dd624c88a05cf0dee727d5555464e6833902.zip
Implement support for pack expansions whose pattern is a non-type
template argument (described by an expression, of course). For example: template<int...> struct int_tuple { }; template<int ...Values> struct square { typedef int_tuple<(Values*Values)...> type; }; It also lays the foundation for pack expansions in an initializer-list. llvm-svn: 122751
Diffstat (limited to 'clang/lib/AST/TemplateBase.cpp')
-rw-r--r--clang/lib/AST/TemplateBase.cpp18
1 files changed, 12 insertions, 6 deletions
diff --git a/clang/lib/AST/TemplateBase.cpp b/clang/lib/AST/TemplateBase.cpp
index 04e8a389cfb..c9715199612 100644
--- a/clang/lib/AST/TemplateBase.cpp
+++ b/clang/lib/AST/TemplateBase.cpp
@@ -17,6 +17,7 @@
#include "clang/AST/DeclBase.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
+#include "clang/AST/ExprCXX.h"
#include "clang/AST/TypeLoc.h"
#include "clang/Basic/Diagnostic.h"
#include "llvm/ADT/FoldingSet.h"
@@ -72,15 +73,14 @@ bool TemplateArgument::isPackExpansion() const {
return false;
case Type:
- return llvm::isa<PackExpansionType>(getAsType());
+ return isa<PackExpansionType>(getAsType());
case Template:
// FIXME: Template template pack expansions.
break;
case Expression:
- // FIXME: Expansion pack expansions.
- break;
+ return isa<PackExpansionExpr>(getAsExpr());
}
return false;
@@ -199,9 +199,11 @@ TemplateArgument TemplateArgument::getPackExpansionPattern() const {
return getAsType()->getAs<PackExpansionType>()->getPattern();
case Expression:
+ return cast<PackExpansionExpr>(getAsExpr())->getPattern();
+
case Template:
// FIXME: Variadic templates.
- llvm_unreachable("Expression and template pack expansions unsupported");
+ llvm_unreachable("Template pack expansions unsupported");
case Declaration:
case Integral:
@@ -343,10 +345,14 @@ TemplateArgumentLoc::getPackExpansionPattern(SourceLocation &Ellipsis,
PatternTSInfo);
}
- case TemplateArgument::Expression:
+ case TemplateArgument::Expression: {
+ Expr *Pattern = cast<PackExpansionExpr>(Argument.getAsExpr())->getPattern();
+ return TemplateArgumentLoc(Pattern, Pattern);
+ }
+
case TemplateArgument::Template:
// FIXME: Variadic templates.
- llvm_unreachable("Expression and template pack expansions unsupported");
+ llvm_unreachable("Template pack expansions unsupported");
case TemplateArgument::Declaration:
case TemplateArgument::Integral:
OpenPOWER on IntegriCloud