r288923 - [RecursiveASTVisitor] Fix post-order traversal of UnaryOperator

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Dec 7 09:56:45 PST 2016


On 7 Dec 2016 9:49 am, "Malcolm Parsons via cfe-commits" <
cfe-commits at lists.llvm.org> wrote:

Author: malcolm.parsons
Date: Wed Dec  7 11:39:04 2016
New Revision: 288923

URL: http://llvm.org/viewvc/llvm-project?rev=288923&view=rev
Log:
[RecursiveASTVisitor] Fix post-order traversal of UnaryOperator

Reviewers: aaron.ballman, klimek, doug.gregor, teemperor, rsmith

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D26742

Modified:
    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
    cfe/trunk/unittests/AST/PostOrderASTVisitor.cpp

Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
clang/AST/RecursiveASTVisitor.h?rev=288923&r1=288922&r2=288923&view=diff
============================================================
==================
--- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
+++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Wed Dec  7 11:39:04
2016
@@ -357,7 +357,8 @@ public:
 #define OPERATOR(NAME)
     \
   bool TraverseUnary##NAME(UnaryOperator *S,
     \
                            DataRecursionQueue *Queue = nullptr) {
    \
-    TRY_TO(WalkUpFromUnary##NAME(S));
    \
+    if (!getDerived().shouldTraversePostOrder())
     \
+      TRY_TO(WalkUpFromUnary##NAME(S));
    \
     TRY_TO_TRAVERSE_OR_ENQUEUE_STMT(S->getSubExpr());
    \
     return true;
     \
   }
    \

Modified: cfe/trunk/unittests/AST/PostOrderASTVisitor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/
AST/PostOrderASTVisitor.cpp?rev=288923&r1=288922&r2=288923&view=diff
============================================================
==================
--- cfe/trunk/unittests/AST/PostOrderASTVisitor.cpp (original)
+++ cfe/trunk/unittests/AST/PostOrderASTVisitor.cpp Wed Dec  7 11:39:04 2016
@@ -34,6 +34,11 @@ namespace {

     bool shouldTraversePostOrder() const { return VisitPostOrder; }

+    bool VisitUnaryOperator(UnaryOperator *Op) {
+      VisitedNodes.push_back(Op->getOpcodeStr(Op->getOpcode()));
+      return true;
+    }
+
     bool VisitBinaryOperator(BinaryOperator *Op) {
       VisitedNodes.push_back(Op->getOpcodeStr());
       return true;
@@ -76,7 +81,7 @@ TEST(RecursiveASTVisitor, PostOrderTrave
   auto ASTUnit = tooling::buildASTFromCode(
     "class A {"
     "  class B {"
-    "    int foo() { while(4) { int i = 9; } return (1 + 3) + 2; }"
+    "    int foo() { while(4) { int i = 9; int j = -i; } return (1 + 3) +
2; }"
     "  };"
     "};"
   );
@@ -87,7 +92,7 @@ TEST(RecursiveASTVisitor, PostOrderTrave
   Visitor.TraverseTranslationUnitDecl(TU);

   std::vector<std::string> expected = {
-    "4", "9", "i", "1", "3", "+", "2", "+", "return", "A::B::foo", "A::B",
"A"
+    "4", "9", "i", "-",


Why does "i" not show up here twice? Do we not include DeclRefExprs in this
list? It looks like we're not testing the relative order of the unary
operator and its operand here.

"j", "1", "3", "+", "2", "+", "return", "A::B::foo", "A::B", "A"
   };
   // Compare the list of actually visited nodes
   // with the expected list of visited nodes.


_______________________________________________
cfe-commits mailing list
cfe-commits at lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161207/0fd41277/attachment-0001.html>


More information about the cfe-commits mailing list