[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 llvm-svn: 288923
This commit is contained in:
parent
c894ac8163
commit
b2b0cb7ca8
|
@ -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; \
|
||||
} \
|
||||
|
|
|
@ -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, PostOrderTraversal) {
|
|||
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, PostOrderTraversal) {
|
|||
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.
|
||||
|
|
Loading…
Reference in New Issue