[PATCH] D26742: [RecursiveASTVisitor] Fix post-order traversal of UnaryOperator
Malcolm Parsons via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 16 04:23:33 PST 2016
malcolm.parsons created this revision.
malcolm.parsons added reviewers: aaron.ballman, klimek, teemperor, doug.gregor.
malcolm.parsons added a subscriber: cfe-commits.
https://reviews.llvm.org/D26742
Files:
include/clang/AST/RecursiveASTVisitor.h
unittests/AST/PostOrderASTVisitor.cpp
Index: unittests/AST/PostOrderASTVisitor.cpp
===================================================================
--- unittests/AST/PostOrderASTVisitor.cpp
+++ unittests/AST/PostOrderASTVisitor.cpp
@@ -34,6 +34,11 @@
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 @@
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 @@
Visitor.TraverseTranslationUnitDecl(TU);
std::vector<std::string> expected = {
- "4", "9", "i", "1", "3", "+", "2", "+", "return", "A::B::foo", "A::B", "A"
+ "4", "9", "i", "-", "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.
Index: include/clang/AST/RecursiveASTVisitor.h
===================================================================
--- include/clang/AST/RecursiveASTVisitor.h
+++ include/clang/AST/RecursiveASTVisitor.h
@@ -357,7 +357,8 @@
#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; \
} \
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D26742.78165.patch
Type: text/x-patch
Size: 2172 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161116/5c2ef841/attachment.bin>
More information about the cfe-commits
mailing list