[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