From: Ted Kremenek Date: Thu, 11 Nov 2010 23:11:43 +0000 (+0000) Subject: Modify CursorVisitor to also walks CXXOperatorCallExprs using data-recursion. Fixes... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8c269ac75569454a049385b1246140db5f2b6faa;p=clang Modify CursorVisitor to also walks CXXOperatorCallExprs using data-recursion. Fixes . git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118853 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index f3aa99ba2f..eecaafabdc 100644 --- a/tools/libclang/CIndex.cpp +++ b/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(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(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: {