[cfe-commits] r73272 - in /cfe/trunk: include/clang/AST/DeclBase.h include/clang/AST/DeclTemplate.h lib/AST/DeclBase.cpp lib/AST/DeclTemplate.cpp
Anders Carlsson
andersca at mac.com
Fri Jun 12 17:08:58 PDT 2009
Author: andersca
Date: Fri Jun 12 19:08:58 2009
New Revision: 73272
URL: http://llvm.org/viewvc/llvm-project?rev=73272&view=rev
Log:
Improvements to TemplateArgumentListBuilder to make it work better with parameter packs.
Modified:
cfe/trunk/include/clang/AST/DeclBase.h
cfe/trunk/include/clang/AST/DeclTemplate.h
cfe/trunk/lib/AST/DeclBase.cpp
cfe/trunk/lib/AST/DeclTemplate.cpp
Modified: cfe/trunk/include/clang/AST/DeclBase.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=73272&r1=73271&r2=73272&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclBase.h (original)
+++ cfe/trunk/include/clang/AST/DeclBase.h Fri Jun 12 19:08:58 2009
@@ -298,9 +298,13 @@
static bool CollectingStats(bool Enable = false);
static void PrintStats();
- /// isTemplateParameter - Determines whether this declartion is a
+ /// isTemplateParameter - Determines whether this declaration is a
/// template parameter.
bool isTemplateParameter() const;
+
+ /// isTemplateParameter - Determines whether this declaration is a
+ /// template parameter pack.
+ bool isTemplateParameterPack() const;
// Implement isa/cast/dyncast/etc.
static bool classof(const Decl *) { return true; }
Modified: cfe/trunk/include/clang/AST/DeclTemplate.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclTemplate.h?rev=73272&r1=73271&r2=73272&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/DeclTemplate.h (original)
+++ cfe/trunk/include/clang/AST/DeclTemplate.h Fri Jun 12 19:08:58 2009
@@ -592,17 +592,37 @@
/// \brief A helper class for making template argument lists.
class TemplateArgumentListBuilder {
+ /// Args - contains the template arguments.
llvm::SmallVector<TemplateArgument, 16> Args;
+
+ llvm::SmallVector<unsigned, 32> Indices;
ASTContext &Context;
+
+ /// isAddingFromParameterPack - Returns whether we're adding arguments from
+ /// a parameter pack.
+ bool isAddingFromParameterPack() const { return Indices.size() % 2; }
+
public:
TemplateArgumentListBuilder(ASTContext &Context) : Context(Context) { }
- // FIXME: Should use the index array size.
- size_t size() const { return Args.size(); }
+ size_t size() const {
+ assert(!isAddingFromParameterPack() &&
+ "Size is not valid when adding from a parameter pack");
+
+ return Args.size();
+ }
+
size_t flatSize() const { return Args.size(); }
void push_back(const TemplateArgument& Arg);
+
+ /// BeginParameterPack - Start adding arguments from a parameter pack.
+ void BeginParameterPack();
+
+ /// EndParameterPack - Finish adding arguments from a parameter pack.
+ void EndParameterPack();
+
TemplateArgument *getFlatArgumentList() { return Args.data(); }
};
Modified: cfe/trunk/lib/AST/DeclBase.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=73272&r1=73271&r2=73272&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclBase.cpp (original)
+++ cfe/trunk/lib/AST/DeclBase.cpp Fri Jun 12 19:08:58 2009
@@ -95,6 +95,13 @@
}
}
+bool Decl::isTemplateParameterPack() const {
+ if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(this))
+ return TTP->isParameterPack();
+
+ return false;
+}
+
//===----------------------------------------------------------------------===//
// PrettyStackTraceDecl Implementation
//===----------------------------------------------------------------------===//
Modified: cfe/trunk/lib/AST/DeclTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclTemplate.cpp?rev=73272&r1=73271&r2=73272&view=diff
==============================================================================
--- cfe/trunk/lib/AST/DeclTemplate.cpp (original)
+++ cfe/trunk/lib/AST/DeclTemplate.cpp Fri Jun 12 19:08:58 2009
@@ -247,9 +247,27 @@
break;
}
+ if (!isAddingFromParameterPack()) {
+ // Add begin and end indicies.
+ Indices.push_back(Args.size());
+ Indices.push_back(Args.size());
+ }
+
Args.push_back(Arg);
}
+void TemplateArgumentListBuilder::BeginParameterPack() {
+ assert(!isAddingFromParameterPack() && "Already adding to parameter pack!");
+
+ Indices.push_back(Args.size());
+}
+
+void TemplateArgumentListBuilder::EndParameterPack() {
+ assert(isAddingFromParameterPack() && "Not adding to parameter pack!");
+
+ Indices.push_back(Args.size());
+}
+
//===----------------------------------------------------------------------===//
// TemplateArgumentList Implementation
//===----------------------------------------------------------------------===//
More information about the cfe-commits
mailing list