aboutsummaryrefslogtreecommitdiff
path: root/lib/Sema/SemaTemplateVariadic.cpp
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-12-23 23:51:58 +0000
committerDouglas Gregor <dgregor@apple.com>2010-12-23 23:51:58 +0000
commit10738d36b150aa65206890c1c845cdba076e4200 (patch)
tree9485127dbdbb9dd5937d9615b97baa9bb3ad3ab4 /lib/Sema/SemaTemplateVariadic.cpp
parent662a4822ee7c8696434b054303c5076a606ab175 (diff)
Add an AST representation for non-type template parameter
packs, e.g., template<typename T, unsigned ...Dims> struct multi_array; along with semantic analysis support for finding unexpanded non-type template parameter packs in types, expressions, and so on. Template instantiation involving non-type template parameter packs probably doesn't work yet. That'll come soon. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@122527 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateVariadic.cpp')
-rw-r--r--lib/Sema/SemaTemplateVariadic.cpp21
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/Sema/SemaTemplateVariadic.cpp b/lib/Sema/SemaTemplateVariadic.cpp
index d9c7e72a86..fe30ba5845 100644
--- a/lib/Sema/SemaTemplateVariadic.cpp
+++ b/lib/Sema/SemaTemplateVariadic.cpp
@@ -63,8 +63,21 @@ namespace {
return true;
}
- // FIXME: Record occurrences of non-type and template template
- // parameter packs.
+ /// \brief Record occurrences of (FIXME: function and) non-type template
+ /// parameter packs in an expression.
+ bool VisitDeclRefExpr(DeclRefExpr *E) {
+ if (NonTypeTemplateParmDecl *NTTP
+ = dyn_cast<NonTypeTemplateParmDecl>(E->getDecl())) {
+ if (NTTP->isParameterPack())
+ Unexpanded.push_back(std::make_pair(NTTP, E->getLocation()));
+ }
+
+ // FIXME: Function parameter packs.
+
+ return true;
+ }
+
+ // FIXME: Record occurrences of template template parameter packs.
// FIXME: Once we have pack expansions in the AST, block their
// traversal.
@@ -95,8 +108,8 @@ namespace {
/// \brief Suppress traversel into types with location information
/// that do not contain unexpanded parameter packs.
bool TraverseTypeLoc(TypeLoc TL) {
- if (!TL.getType().isNull() && TL.
- getType()->containsUnexpandedParameterPack())
+ if (!TL.getType().isNull() &&
+ TL.getType()->containsUnexpandedParameterPack())
return inherited::TraverseTypeLoc(TL);
return true;