]> granicus.if.org Git - clang/commitdiff
[libclang] For CXXOperatorCallExprs, give a valid source location to the DeclRefExpr
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 8 Feb 2012 01:21:13 +0000 (01:21 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Wed, 8 Feb 2012 01:21:13 +0000 (01:21 +0000)
that is referencing the member function, so we can index the referenced function.

Fixes rdar://10762375&10324915 & http://llvm.org/PR11192

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@150033 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclarationName.h
lib/Sema/SemaOverload.cpp
test/Index/annotate-tokens.cpp
test/Index/index-refs.cpp
test/Index/recursive-cxx-member-calls.cpp
tools/libclang/IndexBody.cpp

index 2170f2b1ef7f555e6b091ad3a3f090db47b91026..83594fb0c87dcd56f80deda5e0ac62a614ff598f 100644 (file)
@@ -511,7 +511,9 @@ public:
   SourceLocation getEndLoc() const;
   /// getSourceRange - The range of the declaration name.
   SourceRange getSourceRange() const {
-    return SourceRange(getBeginLoc(), getEndLoc());
+    SourceLocation BeginLoc = getBeginLoc();
+    SourceLocation EndLoc = getEndLoc();
+    return SourceRange(BeginLoc, EndLoc.isValid() ? EndLoc : BeginLoc);
   }
 };
 
index b0b2a783209b1fa55fe046c70110747d781aa829..54dd5f86527154e2a09240cef8b776c442ffcd17 100644 (file)
@@ -9585,7 +9585,7 @@ Sema::CreateOverloadedUnaryOp(SourceLocation OpLoc, unsigned OpcIn,
 
       // Build the actual expression node.
       ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl,
-                                                HadMultipleCandidates);
+                                                HadMultipleCandidates, OpLoc);
       if (FnExpr.isInvalid())
         return ExprError();
 
@@ -10011,12 +10011,12 @@ Sema::CreateOverloadedArraySubscriptExpr(SourceLocation LLoc,
         ResultTy = ResultTy.getNonLValueExprType(Context);
 
         // Build the actual expression node.
-        DeclarationNameLoc LocInfo;
-        LocInfo.CXXOperatorName.BeginOpNameLoc = LLoc.getRawEncoding();
-        LocInfo.CXXOperatorName.EndOpNameLoc = RLoc.getRawEncoding();
+        DeclarationNameInfo OpLocInfo(OpName, LLoc);
+        OpLocInfo.setCXXOperatorNameRange(SourceRange(LLoc, RLoc));
         ExprResult FnExpr = CreateFunctionRefExpr(*this, FnDecl,
                                                   HadMultipleCandidates,
-                                                  LLoc, LocInfo);
+                                                  OpLocInfo.getLoc(),
+                                                  OpLocInfo.getInfo());
         if (FnExpr.isInvalid())
           return ExprError();
 
@@ -10521,8 +10521,13 @@ Sema::BuildCallToObjectOfClassType(Scope *S, Expr *Obj,
   for (unsigned ArgIdx = 0; ArgIdx < NumArgs; ++ArgIdx)
     MethodArgs[ArgIdx + 1] = Args[ArgIdx];
 
+  DeclarationNameInfo OpLocInfo(
+               Context.DeclarationNames.getCXXOperatorName(OO_Call), LParenLoc);
+  OpLocInfo.setCXXOperatorNameRange(SourceRange(LParenLoc, RParenLoc));
   ExprResult NewFn = CreateFunctionRefExpr(*this, Method,
-                                           HadMultipleCandidates);
+                                           HadMultipleCandidates,
+                                           OpLocInfo.getLoc(),
+                                           OpLocInfo.getInfo());
   if (NewFn.isInvalid())
     return true;
 
@@ -10698,7 +10703,7 @@ Sema::BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc) {
 
   // Build the operator call.
   ExprResult FnExpr = CreateFunctionRefExpr(*this, Method,
-                                            HadMultipleCandidates);
+                                            HadMultipleCandidates, OpLoc);
   if (FnExpr.isInvalid())
     return ExprError();
 
index 5a8f5e201d0f24e33f954f45b2ffa9968af2d7be..3062901b7c2fb4531040a9050930846d57326e09 100644 (file)
@@ -34,7 +34,7 @@ void test3(S2 s2) {
 // CHECK: Punctuation: ")" [2:17 - 2:18] FunctionDecl=test:2:6 (Definition)
 // CHECK: Punctuation: "{" [2:19 - 2:20] CompoundStmt=
 // CHECK: Identifier: "X" [3:5 - 3:6] DeclRefExpr=X:2:16
-// CHECK: Punctuation: "=" [3:7 - 3:8] CallExpr=operator=:1:8
+// CHECK: Punctuation: "=" [3:7 - 3:8] DeclRefExpr=operator=:1:8
 // CHECK: Identifier: "X" [3:9 - 3:10] DeclRefExpr=X:2:16
 // CHECK: Punctuation: ";" [3:10 - 3:11] CompoundStmt=
 // CHECK: Keyword: "__is_base_of" [4:5 - 4:17] UnexposedExpr=
@@ -78,7 +78,7 @@ void test3(S2 s2) {
 // CHECK: Punctuation: "(" [13:3 - 13:4] ParenExpr=
 // CHECK: Identifier: "x" [13:4 - 13:5] DeclRefExpr=x:11:14
 // CHECK: Punctuation: ")" [13:5 - 13:6] ParenExpr=
-// CHECK: Punctuation: "++" [13:6 - 13:8] CallExpr=operator++:9:5
+// CHECK: Punctuation: "++" [13:6 - 13:8] DeclRefExpr=operator++:9:5
 // CHECK: Punctuation: ";" [13:8 - 13:9] CompoundStmt=
 // CHECK: Punctuation: "}" [14:1 - 14:2] CompoundStmt=
 // CHECK: Keyword: "struct" [16:1 - 16:7] StructDecl=S1:16:8 (Definition)
@@ -111,7 +111,7 @@ void test3(S2 s2) {
 // CHECK: Punctuation: ")" [18:17 - 18:18] FunctionDecl=test3:18:6 (Definition)
 // CHECK: Punctuation: "{" [18:19 - 18:20] CompoundStmt=
 // CHECK: Identifier: "s2" [19:3 - 19:5] DeclRefExpr=s2:18:15
-// CHECK: Punctuation: "->" [19:5 - 19:7] MemberRefExpr=f:16:18
+// CHECK: Punctuation: "->" [19:5 - 19:7] DeclRefExpr=operator->:17:17
 // CHECK: Identifier: "f" [19:7 - 19:8] MemberRefExpr=f:16:18
 // CHECK: Punctuation: "(" [19:8 - 19:9] CallExpr=f:16:18
 // CHECK: Punctuation: ")" [19:9 - 19:10] CallExpr=f:16:18
index 0b3c0bc423c6d80051077d4a1dae9390c8d776a3..00767b061d0270a64bbd724b822f2d3ff97fac0a 100644 (file)
@@ -18,6 +18,22 @@ enum {
   SecondVal = EnumVal
 };
 
+struct S {
+  S& operator++();
+  int operator*();
+  S& operator=(int x);
+  S& operator!=(int x);
+  S& operator()(int x);
+};
+
+void foo2(S &s) {
+  (void)++s;
+  (void)*s;
+  s = 3;
+  (void)(s != 3);
+  s(3);
+}
+
 // RUN: c-index-test -index-file %s | FileCheck %s
 // CHECK:      [indexDeclaration]: kind: namespace | name: NS
 // CHECK-NEXT: [indexDeclaration]: kind: variable | name: gx
@@ -35,3 +51,10 @@ enum {
 // CHECK-NEXT: [indexDeclaration]: kind: enum
 // CHECK-NEXT: [indexDeclaration]: kind: enumerator | name: SecondVal
 // CHECK-NEXT: [indexEntityReference]: kind: enumerator | name: EnumVal
+
+// CHECK:      [indexDeclaration]: kind: function | name: foo2
+// CHECK:      [indexEntityReference]: kind: c++-instance-method | name: operator++
+// CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator*
+// CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator=
+// CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator!=
+// CHECK-NEXT: [indexEntityReference]: kind: c++-instance-method | name: operator()
index adaaae9cdd19cabc4c0a1640c4f3edf777886f9b..b80cbf40e87ce4ef9930304194a92400550a4821 100644 (file)
@@ -933,7 +933,7 @@ AttributeList::Kind AttributeList::getKind(const IdentifierInfo * Name) {
 // CHECK-tokens: Punctuation: ")" [102:58 - 102:59] CallExpr=endswith:56:8
 // CHECK-tokens: Punctuation: ")" [102:59 - 102:60] IfStmt=
 // CHECK-tokens: Identifier: "AttrName" [103:5 - 103:13] DeclRefExpr=AttrName:101:19
-// CHECK-tokens: Punctuation: "=" [103:14 - 103:15] CallExpr=operator=:38:7
+// CHECK-tokens: Punctuation: "=" [103:14 - 103:15] DeclRefExpr=operator=:38:7
 // CHECK-tokens: Identifier: "AttrName" [103:16 - 103:24] DeclRefExpr=AttrName:101:19
 // CHECK-tokens: Punctuation: "." [103:24 - 103:25] MemberRefExpr=substr:60:13
 // CHECK-tokens: Identifier: "substr" [103:25 - 103:31] MemberRefExpr=substr:60:13
index 08c7d18f69079c620ddbae0eed51c9acdc527b61..c40049113287e8dc9633264a754dfe63d5f400d6 100644 (file)
@@ -90,6 +90,12 @@ public:
     return true;
   }
 
+  bool TraverseCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
+    if (E->getOperatorLoc().isInvalid())
+      return true; // implicit.
+    return base::TraverseCXXOperatorCallExpr(E);
+  }
+
   bool VisitDeclStmt(DeclStmt *S) {
     if (IndexCtx.indexFunctionLocalSymbols())
       IndexCtx.indexDeclGroupRef(S->getDeclGroup());