// Expression visitors
bool VisitDeclRefExpr(DeclRefExpr *E);
- bool VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E);
bool VisitBlockExpr(BlockExpr *B);
bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
bool VisitExplicitCastExpr(ExplicitCastExpr *E);
DATA_RECURSIVE_VISIT(BinaryOperator)
DATA_RECURSIVE_VISIT(MemberExpr)
DATA_RECURSIVE_VISIT(CXXMemberCallExpr)
+ DATA_RECURSIVE_VISIT(CXXOperatorCallExpr)
// Data-recursive visitor functions.
bool IsInRegionOfInterest(CXCursor C);
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(),
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;
+ }
}
}
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()) {
}
case Stmt::CallExprClass:
case Stmt::CXXMemberCallExprClass:
+ case Stmt::CXXOperatorCallExprClass:
case Stmt::ParenExprClass:
case Stmt::MemberExprClass:
case Stmt::BinaryOperatorClass: {