diff options
-rw-r--r-- | clang/lib/Index/IndexBody.cpp | 17 | ||||
-rw-r--r-- | clang/test/Index/Core/designated-inits.c | 33 |
2 files changed, 50 insertions, 0 deletions
diff --git a/clang/lib/Index/IndexBody.cpp b/clang/lib/Index/IndexBody.cpp index 0606873167d..a0e9131136e 100644 --- a/clang/lib/Index/IndexBody.cpp +++ b/clang/lib/Index/IndexBody.cpp @@ -300,6 +300,7 @@ public: IndexingContext &IndexCtx; const NamedDecl *Parent; const DeclContext *ParentDC; + bool Visited = false; public: SyntacticFormIndexer(IndexingContext &indexCtx, @@ -308,6 +309,22 @@ public: bool shouldWalkTypesOfTypeLocs() const { return false; } + bool TraverseInitListExpr(InitListExpr *S, DataRecursionQueue *Q = nullptr) { + // Don't visit nested InitListExprs, this visitor will be called again + // later on for the nested ones. + if (Visited) + return true; + Visited = true; + InitListExpr *SyntaxForm = S->isSemanticForm() ? S->getSyntacticForm() : S; + if (SyntaxForm) { + for (Stmt *SubStmt : SyntaxForm->children()) { + if (!TraverseStmt(SubStmt, Q)) + return false; + } + } + return true; + } + bool VisitDesignatedInitExpr(DesignatedInitExpr *E) { for (DesignatedInitExpr::Designator &D : llvm::reverse(E->designators())) { if (D.isFieldDesignator()) diff --git a/clang/test/Index/Core/designated-inits.c b/clang/test/Index/Core/designated-inits.c new file mode 100644 index 00000000000..24bb9a9acdf --- /dev/null +++ b/clang/test/Index/Core/designated-inits.c @@ -0,0 +1,33 @@ +// RUN: c-index-test core -print-source-symbols -- %s -target x86_64-apple-macosx10.7 | FileCheck %s + +struct MyStruct { + int myfield; +}; + +enum { + MyValToSet; +}; + +// CHECK: [[@LINE+1]]:14 | struct/C | MyStruct | +const struct MyStruct _MyStruct[] + [16] + [3] + [3] + [2] + [2] = { + [0] = { + [0] = { + [0] = { + [0][0] = { + [0] = { + // CHECK: [[@LINE+2]]:14 | field/C | myfield | {{.*}} | Ref | + // CHECK: [[@LINE+1]]:24 | enumerator/C | MyValToSet | + .myfield = MyValToSet, + // CHECK-NOT: | field/C | myfield | + // CHECK-NOT: | enumerator/C | MyValToSet | + }, + }, + }, + }, + }, +}; |