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

Reply via email to