Hello,
The attached patches rename ABSTRACT to ABSTRACT_STMT to avoid
collisions, and also avoid creating FIRST_* and LAST_* macros for each
node, instead using a STMT_RANGE(Base, First, Last) macro.
Sean
diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h
index a7a1340..dfe7090 100644
--- a/include/clang/AST/RecursiveASTVisitor.h
+++ b/include/clang/AST/RecursiveASTVisitor.h
@@ -237,7 +237,7 @@ DISPATCH(UnaryOperator, UnaryOperator, S); \
// Top switch stmt: dispatch to VisitFooStmt for each FooStmt.
switch (S->getStmtClass()) {
case Stmt::NoStmtClass: break;
-#define ABSTRACT(STMT)
+#define ABSTRACT_STMT(STMT)
#define STMT(CLASS, PARENT) \
case Stmt::CLASS ## Class: DISPATCH(CLASS, CLASS, S);
#include "clang/AST/StmtNodes.inc"
diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h
index bae6da0..63b3e56 100644
--- a/include/clang/AST/Stmt.h
+++ b/include/clang/AST/Stmt.h
@@ -98,24 +98,13 @@ public:
enum StmtClass {
NoStmtClass = 0,
#define STMT(CLASS, PARENT) CLASS##Class,
-#define FIRST_STMT(CLASS) firstStmtConstant = CLASS##Class,
-// LAST_STMT will always come last
-#define LAST_STMT(CLASS) lastStmtConstant = CLASS##Class
-#define FIRST_EXPR(CLASS) firstExprConstant = CLASS##Class,
-#define LAST_EXPR(CLASS) lastExprConstant = CLASS##Class,
-#define FIRST_CALLEXPR(CLASS) firstCallExprConstant = CLASS##Class,
-#define LAST_CALLEXPR(CLASS) lastCallExprConstant = CLASS##Class,
-#define FIRST_CASTEXPR(CLASS) firstCastExprConstant = CLASS##Class,
-#define LAST_CASTEXPR(CLASS) lastCastExprConstant = CLASS##Class,
-#define FIRST_EXPLICITCASTEXPR(CLASS) firstExplicitCastExprConstant = \
- CLASS##Class,
-#define LAST_EXPLICITCASTEXPR(CLASS) lastExplicitCastExprConstant = \
- CLASS##Class,
-#define FIRST_BINARYOPERATOR(CLASS) firstBinaryOperatorConstant = \
- CLASS##Class,
-#define LAST_BINARYOPERATOR(CLASS) lastBinaryOperatorConstant = \
- CLASS##Class,
-#define ABSTRACT(STMT)
+#define STMT_RANGE(BASE, FIRST, LAST) \
+ first##BASE##Constant = FIRST##Class, \
+ last##BASE##Constant = LAST##Class,
+#define LAST_STMT_RANGE(BASE, FIRST, LAST) \
+ first##BASE##Constant = FIRST##Class, \
+ last##BASE##Constant = LAST##Class
+#define ABSTRACT_STMT(STMT)
#include "clang/AST/StmtNodes.inc"
};
private:
diff --git a/include/clang/AST/StmtVisitor.h b/include/clang/AST/StmtVisitor.h
index f1d478d..8078451 100644
--- a/include/clang/AST/StmtVisitor.h
+++ b/include/clang/AST/StmtVisitor.h
@@ -105,7 +105,7 @@ public:
// Top switch stmt: dispatch to VisitFooStmt for each FooStmt.
switch (S->getStmtClass()) {
default: assert(0 && "Unknown stmt kind!");
-#define ABSTRACT(STMT)
+#define ABSTRACT_STMT(STMT)
#define STMT(CLASS, PARENT) \
case Stmt::CLASS ## Class: DISPATCH(CLASS, CLASS);
#include "clang/AST/StmtNodes.inc"
diff --git a/lib/AST/Stmt.cpp b/lib/AST/Stmt.cpp
index f6f3ae5..80f5695 100644
--- a/lib/AST/Stmt.cpp
+++ b/lib/AST/Stmt.cpp
@@ -36,7 +36,7 @@ static StmtClassNameTable &getStmtInfoTableEntry(Stmt::StmtClass E) {
// Intialize the table on the first use.
Initialized = true;
-#define ABSTRACT(STMT)
+#define ABSTRACT_STMT(STMT)
#define STMT(CLASS, PARENT) \
StmtClassInfo[(unsigned)Stmt::CLASS##Class].Name = #CLASS; \
StmtClassInfo[(unsigned)Stmt::CLASS##Class].Size = sizeof(CLASS);
diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h
index 4923480..c7387a2 100644
--- a/lib/Sema/TreeTransform.h
+++ b/lib/Sema/TreeTransform.h
@@ -344,7 +344,7 @@ public:
OwningStmtResult Transform##Node(Node *S);
#define EXPR(Node, Parent) \
OwningExprResult Transform##Node(Node *E);
-#define ABSTRACT(Stmt)
+#define ABSTRACT_STMT(Stmt)
#include "clang/AST/StmtNodes.inc"
/// \brief Build a new pointer type given its pointee type.
@@ -1958,7 +1958,7 @@ Sema::OwningStmtResult TreeTransform<Derived>::TransformStmt(Stmt *S) {
// Transform expressions by calling TransformExpr.
#define STMT(Node, Parent)
-#define ABSTRACT(Stmt)
+#define ABSTRACT_STMT(Stmt)
#define EXPR(Node, Parent) case Stmt::Node##Class:
#include "clang/AST/StmtNodes.inc"
{
@@ -1982,7 +1982,7 @@ Sema::OwningExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
switch (E->getStmtClass()) {
case Stmt::NoStmtClass: break;
#define STMT(Node, Parent) case Stmt::Node##Class: break;
-#define ABSTRACT(Stmt)
+#define ABSTRACT_STMT(Stmt)
#define EXPR(Node, Parent) \
case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
#include "clang/AST/StmtNodes.inc"
diff --git a/utils/TableGen/ClangASTNodesEmitter.cpp b/utils/TableGen/ClangASTNodesEmitter.cpp
index 2e7c521..5d6423d 100644
--- a/utils/TableGen/ClangASTNodesEmitter.cpp
+++ b/utils/TableGen/ClangASTNodesEmitter.cpp
@@ -37,7 +37,8 @@ typedef ChildMap::const_iterator ChildIterator;
// Called recursively to ensure that nodes remain contiguous
static std::pair<Record *, Record *> EmitStmtNode(const ChildMap &Tree,
raw_ostream &OS,
- Record *Base) {
+ Record *Base,
+ bool Root = true) {
std::string BaseName = macroName(Base->getName());
ChildIterator i = Tree.lower_bound(Base), e = Tree.upper_bound(Base);
@@ -59,14 +60,15 @@ static std::pair<Record *, Record *> EmitStmtNode(const ChildMap &Tree,
OS << "#endif\n";
if (Abstract)
- OS << "ABSTRACT(" << NodeName << "(" << R->getName() << ", "
+ OS << "ABSTRACT_STMT(" << NodeName << "(" << R->getName() << ", "
<< Base->getName() << "))\n";
else
OS << NodeName << "(" << R->getName() << ", "
<< Base->getName() << ")\n";
if (Tree.find(R) != Tree.end()) {
- const std::pair<Record *, Record *> &Result = EmitStmtNode(Tree, OS, R);
+ const std::pair<Record *, Record *> &Result
+ = EmitStmtNode(Tree, OS, R, false);
if (!First && Result.first)
First = Result.first;
if (Result.second)
@@ -83,32 +85,35 @@ static std::pair<Record *, Record *> EmitStmtNode(const ChildMap &Tree,
OS << "#undef " << NodeName << "\n\n";
}
- assert(!First == !Last && "Got a first or last node, but not the other");
-
if (First) {
- OS << "#ifndef FIRST_" << BaseName << "\n";
- OS << "# define FIRST_" << BaseName << "(CLASS)\n";
- OS << "#endif\n";
- OS << "#ifndef LAST_" << BaseName << "\n";
- OS << "# define LAST_" << BaseName << "(CLASS)\n";
- OS << "#endif\n\n";
-
- OS << "FIRST_" << BaseName << "(" << First->getName() << ")\n";
- OS << "LAST_" << BaseName << "(" << Last->getName() << ")\n\n";
+ assert (Last && "Got a first node but not a last node for a range!");
+ if (Root)
+ OS << "LAST_STMT_RANGE(";
+ else
+ OS << "STMT_RANGE(";
+
+ OS << Base->getName() << ", " << First->getName() << ", "
+ << Last->getName() << ")\n\n";
}
- OS << "#undef FIRST_" << BaseName << "\n";
- OS << "#undef LAST_" << BaseName << "\n\n";
-
return std::make_pair(First, Last);
}
void ClangStmtNodesEmitter::run(raw_ostream &OS) {
// Write the preamble
- OS << "#ifndef ABSTRACT\n";
- OS << "# define ABSTRACT(Stmt) Stmt\n";
+ OS << "#ifndef ABSTRACT_STMT\n";
+ OS << "# define ABSTRACT_STMT(Stmt) Stmt\n";
+ OS << "#endif\n";
+
+ OS << "#ifndef STMT_RANGE\n";
+ OS << "# define STMT_RANGE(Base, First, Last)\n";
OS << "#endif\n\n";
+ OS << "#ifndef LAST_STMT_RANGE\n";
+ OS << "# define LAST_STMT_RANGE(Base, First, Last) "
+ "STMT_RANGE(Base, First, Last)\n";
+ OS << "#endif\n\n";
+
// Emit statements
const std::vector<Record*> Stmts = Records.getAllDerivedDefinitions("Stmt");
@@ -130,5 +135,7 @@ void ClangStmtNodesEmitter::run(raw_ostream &OS) {
EmitStmtNode(Tree, OS, &Stmt);
OS << "#undef STMT\n";
- OS << "#undef ABSTRACT\n";
+ OS << "#undef STMT_RANGE\n";
+ OS << "#undef LAST_STMT_RANGE\n";
+ OS << "#undef ABSTRACT_STMT\n";
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits