diff options
| author | Ted Kremenek <kremenek@apple.com> | 2010-11-11 23:11:43 +0000 |
|---|---|---|
| committer | Ted Kremenek <kremenek@apple.com> | 2010-11-11 23:11:43 +0000 |
| commit | 7716cd62b30e3870b479dd539766502eb71de118 (patch) | |
| tree | e3dc05e0a9ab00c9f7dba7926edd0b120fab3e42 | |
| parent | 843c53828fa7ae1f6e121d9ab5352054173ea31d (diff) | |
| download | bcm5719-llvm-7716cd62b30e3870b479dd539766502eb71de118.tar.gz bcm5719-llvm-7716cd62b30e3870b479dd539766502eb71de118.zip | |
Modify CursorVisitor to also walks CXXOperatorCallExprs using data-recursion. Fixes <rdar://problem/8659019>.
llvm-svn: 118853
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index f3aa99ba2f1..eecaafabdc3 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -330,7 +330,6 @@ public: // Expression visitors bool VisitDeclRefExpr(DeclRefExpr *E); - bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E); bool VisitBlockExpr(BlockExpr *B); bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E); bool VisitExplicitCastExpr(ExplicitCastExpr *E); @@ -362,6 +361,7 @@ bool Visit##NAME(NAME *S) { return VisitDataRecursive(S); } DATA_RECURSIVE_VISIT(BinaryOperator) DATA_RECURSIVE_VISIT(MemberExpr) DATA_RECURSIVE_VISIT(CXXMemberCallExpr) + DATA_RECURSIVE_VISIT(CXXOperatorCallExpr) // Data-recursive visitor functions. bool IsInRegionOfInterest(CXCursor C); @@ -1596,20 +1596,6 @@ bool CursorVisitor::VisitDeclRefExpr(DeclRefExpr *E) { return false; } -bool CursorVisitor::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) { - if (Visit(MakeCXCursor(E->getArg(0), StmtParent, TU))) - return true; - - if (Visit(MakeCXCursor(E->getCallee(), StmtParent, TU))) - return true; - - for (unsigned I = 1, N = E->getNumArgs(); I != N; ++I) - if (Visit(MakeCXCursor(E->getArg(I), StmtParent, TU))) - return true; - - return false; -} - bool CursorVisitor::VisitCXXRecordDecl(CXXRecordDecl *D) { if (D->isDefinition()) { for (CXXRecordDecl::base_class_iterator I = D->bases_begin(), @@ -1992,6 +1978,18 @@ void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, Stmt *S) { WL.push_back(StmtVisit(M->getBase(), C)); break; } + case Stmt::CXXOperatorCallExprClass: { + CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(S); + // Note that we enqueue things in reverse order so that + // they are visited correctly by the DFS. + + for (unsigned I = 1, N = CE->getNumArgs(); I != N; ++I) + WL.push_back(StmtVisit(CE->getArg(N-I), C)); + + WL.push_back(StmtVisit(CE->getCallee(), C)); + WL.push_back(StmtVisit(CE->getArg(0), C)); + break; + } } } @@ -2016,6 +2014,9 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { case VisitorJob::StmtVisitKind: { // Update the current cursor. Stmt *S = cast<StmtVisit>(LI).get(); + if (!S) + continue; + CXCursor Cursor = MakeCXCursor(S, StmtParent, TU); switch (S->getStmtClass()) { @@ -2027,6 +2028,7 @@ bool CursorVisitor::RunVisitorWorkList(VisitorWorkList &WL) { } case Stmt::CallExprClass: case Stmt::CXXMemberCallExprClass: + case Stmt::CXXOperatorCallExprClass: case Stmt::ParenExprClass: case Stmt::MemberExprClass: case Stmt::BinaryOperatorClass: { |

