diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2016-10-31 22:12:12 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2016-10-31 22:12:12 +0000 |
commit | 67eda2ad1d2275bacbf4afb9f50b341aec6ca17d (patch) | |
tree | b0ad21f71047ed31a5c17b2c65d9cb38ca08bbf1 | |
parent | 5d51a769949a59e5cabf2a09a955d333d11dafa4 (diff) | |
download | llvm-67eda2ad1d2275bacbf4afb9f50b341aec6ca17d.zip llvm-67eda2ad1d2275bacbf4afb9f50b341aec6ca17d.tar.gz llvm-67eda2ad1d2275bacbf4afb9f50b341aec6ca17d.tar.bz2 |
[index] Fix repeated visitation of the same InitListExpr for indexing.
It was visited multiple times unnecessarily.
rdar://28985038
llvm-svn: 285647
-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 0606873..a0e9131 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 0000000..24bb9a9 --- /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 | + }, + }, + }, + }, + }, +}; |