[cfe-commits] r77713 - in /cfe/trunk: lib/Index/ResolveLocation.cpp test/Index/cxx-operator-overload.cpp
Argiris Kirtzidis
akyrtzi at gmail.com
Fri Jul 31 12:02:11 PDT 2009
Author: akirtzidis
Date: Fri Jul 31 14:02:11 2009
New Revision: 77713
URL: http://llvm.org/viewvc/llvm-project?rev=77713&view=rev
Log:
For a CXXOperatorCallExpr, fix the order that StmtLocResolver uses to check subexpressions.
Modified:
cfe/trunk/lib/Index/ResolveLocation.cpp
cfe/trunk/test/Index/cxx-operator-overload.cpp
Modified: cfe/trunk/lib/Index/ResolveLocation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/ResolveLocation.cpp?rev=77713&r1=77712&r2=77713&view=diff
==============================================================================
--- cfe/trunk/lib/Index/ResolveLocation.cpp (original)
+++ cfe/trunk/lib/Index/ResolveLocation.cpp Fri Jul 31 14:02:11 2009
@@ -78,6 +78,7 @@
StmtLocResolver(ASTContext &ctx, SourceLocation loc, Decl *parent)
: LocResolverBase(ctx, loc), Parent(parent) {}
+ ASTLocation VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node);
ASTLocation VisitDeclStmt(DeclStmt *Node);
ASTLocation VisitStmt(Stmt *Node);
};
@@ -101,6 +102,35 @@
} // anonymous namespace
+ASTLocation
+StmtLocResolver::VisitCXXOperatorCallExpr(CXXOperatorCallExpr *Node) {
+ assert(ContainsLocation(Node) &&
+ "Should visit only after verifying that loc is in range");
+
+ if (Node->getNumArgs() == 1)
+ // Unary operator. Let normal child traversal handle it.
+ return VisitCallExpr(Node);
+
+ assert(Node->getNumArgs() == 2 &&
+ "Wrong args for the C++ operator call expr ?");
+
+ llvm::SmallVector<Expr *, 3> Nodes;
+ // Binary operator. Check in order of 1-left arg, 2-callee, 3-right arg.
+ Nodes.push_back(Node->getArg(0));
+ Nodes.push_back(Node->getCallee());
+ Nodes.push_back(Node->getArg(1));
+
+ for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
+ RangePos RP = CheckRange(Nodes[i]);
+ if (RP == AfterLoc)
+ break;
+ if (RP == ContainsLoc)
+ return Visit(Nodes[i]);
+ }
+
+ return ASTLocation(Parent, Node);
+}
+
ASTLocation StmtLocResolver::VisitDeclStmt(DeclStmt *Node) {
assert(ContainsLocation(Node) &&
"Should visit only after verifying that loc is in range");
@@ -125,6 +155,9 @@
// Search the child statements.
for (Stmt::child_iterator
I = Node->child_begin(), E = Node->child_end(); I != E; ++I) {
+ if (*I == NULL)
+ continue;
+
RangePos RP = CheckRange(*I);
if (RP == AfterLoc)
break;
Modified: cfe/trunk/test/Index/cxx-operator-overload.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/cxx-operator-overload.cpp?rev=77713&r1=77712&r2=77713&view=diff
==============================================================================
--- cfe/trunk/test/Index/cxx-operator-overload.cpp (original)
+++ cfe/trunk/test/Index/cxx-operator-overload.cpp Fri Jul 31 14:02:11 2009
@@ -23,4 +23,6 @@
// RUN: index-test %t.ast -point-at %s:5:15 -print-refs > %t &&
// RUN: cat %t | count 2 &&
// RUN: grep ':10:17,' %t &&
-// RUN: grep ':10:22,' %t
+// RUN: grep ':10:22,' %t &&
+
+// RUN: index-test %t.ast -point-at %s:10:14 | grep 'DeclRefExpr x1'
More information about the cfe-commits
mailing list