From a1bed4cd96141eb92e94acd56d02167ec007626e Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Wed, 22 Feb 2012 02:10:41 +0000 Subject: [PATCH] [libclang] Index the field references of a designated initializer, rdar://10906206 llvm-svn: 151118 --- clang/test/Index/index-refs.cpp | 11 +++++++++++ clang/tools/libclang/IndexBody.cpp | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/clang/test/Index/index-refs.cpp b/clang/test/Index/index-refs.cpp index 56afa08ec88a..77e2af71f885 100644 --- a/clang/test/Index/index-refs.cpp +++ b/clang/test/Index/index-refs.cpp @@ -61,6 +61,14 @@ typedef int some_arr[array_size]; const int default_param = 3; void foo4(int p = default_param); +struct S2 { + int x,y; +}; + +void foo5() { + struct S2 s = { .y = 1, .x = 4}; +} + // RUN: c-index-test -index-file %s | FileCheck %s // CHECK: [indexDeclaration]: kind: namespace | name: NS // CHECK-NEXT: [indexDeclaration]: kind: variable | name: gx @@ -108,3 +116,6 @@ void foo4(int p = default_param); // CHECK: [indexEntityReference]: kind: variable | name: array_size | {{.*}} | loc: 59:22 // CHECK: [indexEntityReference]: kind: variable | name: default_param | {{.*}} | loc: 62:19 // CHECK-NOT: [indexEntityReference]: kind: variable | name: default_param | {{.*}} | loc: 62:19 + +// CHECK: [indexEntityReference]: kind: field | name: y | {{.*}} | loc: 69:20 +// CHECK-NEXT: [indexEntityReference]: kind: field | name: x | {{.*}} | loc: 69:28 diff --git a/clang/tools/libclang/IndexBody.cpp b/clang/tools/libclang/IndexBody.cpp index 9330194ceecb..cce0bf705aa2 100644 --- a/clang/tools/libclang/IndexBody.cpp +++ b/clang/tools/libclang/IndexBody.cpp @@ -51,6 +51,17 @@ public: return true; } + bool VisitDesignatedInitExpr(DesignatedInitExpr *E) { + for (DesignatedInitExpr::reverse_designators_iterator + D = E->designators_rbegin(), DEnd = E->designators_rend(); + D != DEnd; ++D) { + if (D->isFieldDesignator()) + IndexCtx.handleReference(D->getField(), D->getFieldLoc(), + Parent, ParentDC, E); + } + return true; + } + bool VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) { IndexCtx.handleReference(E->getDecl(), E->getLocation(), Parent, ParentDC, E);