<div dir="auto"><div><div class="gmail_extra"><div class="gmail_quote">On 7 Dec 2016 9:49 am, "Malcolm Parsons via cfe-commits" <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: malcolm.parsons<br>
Date: Wed Dec  7 11:39:04 2016<br>
New Revision: 288923<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=288923&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=288923&view=rev</a><br>
Log:<br>
[RecursiveASTVisitor] Fix post-order traversal of UnaryOperator<br>
<br>
Reviewers: aaron.ballman, klimek, doug.gregor, teemperor, rsmith<br>
<br>
Subscribers: cfe-commits<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D26742" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D26742</a><br>
<br>
Modified:<br>
    cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h<br>
    cfe/trunk/unittests/AST/<wbr>PostOrderASTVisitor.cpp<br>
<br>
Modified: cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=288923&r1=288922&r2=288923&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/AST/RecursiveASTVisitor.<wbr>h?rev=288923&r1=288922&r2=<wbr>288923&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h (original)<br>
+++ cfe/trunk/include/clang/AST/<wbr>RecursiveASTVisitor.h Wed Dec  7 11:39:04 2016<br>
@@ -357,7 +357,8 @@ public:<br>
 #define OPERATOR(NAME)                                                         \<br>
   bool TraverseUnary##NAME(<wbr>UnaryOperator *S,                                   \<br>
                            DataRecursionQueue *Queue = nullptr) {              \<br>
-    TRY_TO(WalkUpFromUnary##NAME(<wbr>S));                                          \<br>
+    if (!getDerived().<wbr>shouldTraversePostOrder())                               \<br>
+      TRY_TO(WalkUpFromUnary##NAME(<wbr>S));                                        \<br>
     TRY_TO_TRAVERSE_OR_ENQUEUE_<wbr>STMT(S->getSubExpr());                          \<br>
     return true;                                                               \<br>
   }                                                                            \<br>
<br>
Modified: cfe/trunk/unittests/AST/<wbr>PostOrderASTVisitor.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/PostOrderASTVisitor.cpp?rev=288923&r1=288922&r2=288923&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/unittests/<wbr>AST/PostOrderASTVisitor.cpp?<wbr>rev=288923&r1=288922&r2=<wbr>288923&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/unittests/AST/<wbr>PostOrderASTVisitor.cpp (original)<br>
+++ cfe/trunk/unittests/AST/<wbr>PostOrderASTVisitor.cpp Wed Dec  7 11:39:04 2016<br>
@@ -34,6 +34,11 @@ namespace {<br>
<br>
     bool shouldTraversePostOrder() const { return VisitPostOrder; }<br>
<br>
+    bool VisitUnaryOperator(<wbr>UnaryOperator *Op) {<br>
+      VisitedNodes.push_back(Op-><wbr>getOpcodeStr(Op->getOpcode()))<wbr>;<br>
+      return true;<br>
+    }<br>
+<br>
     bool VisitBinaryOperator(<wbr>BinaryOperator *Op) {<br>
       VisitedNodes.push_back(Op-><wbr>getOpcodeStr());<br>
       return true;<br>
@@ -76,7 +81,7 @@ TEST(RecursiveASTVisitor, PostOrderTrave<br>
   auto ASTUnit = tooling::buildASTFromCode(<br>
     "class A {"<br>
     "  class B {"<br>
-    "    int foo() { while(4) { int i = 9; } return (1 + 3) + 2; }"<br>
+    "    int foo() { while(4) { int i = 9; int j = -i; } return (1 + 3) + 2; }"<br>
     "  };"<br>
     "};"<br>
   );<br>
@@ -87,7 +92,7 @@ TEST(RecursiveASTVisitor, PostOrderTrave<br>
   Visitor.<wbr>TraverseTranslationUnitDecl(<wbr>TU);<br>
<br>
   std::vector<std::string> expected = {<br>
-    "4", "9", "i", "1", "3", "+", "2", "+", "return", "A::B::foo", "A::B", "A"<br>
+    "4", "9", "i", "-",</blockquote></div></div></div><div dir="auto"><br></div><div dir="auto">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.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> "j", "1", "3", "+", "2", "+", "return", "A::B::foo", "A::B", "A"<br>
   };<br>
   // Compare the list of actually visited nodes<br>
   // with the expected list of visited nodes.<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div></div>