Author: akirtzidis Date: Mon Oct 31 17:12:12 2016 New Revision: 285647 URL: http://llvm.org/viewvc/llvm-project?rev=285647&view=rev Log: [index] Fix repeated visitation of the same InitListExpr for indexing.
It was visited multiple times unnecessarily. rdar://28985038 Added: cfe/trunk/test/Index/Core/designated-inits.c Modified: cfe/trunk/lib/Index/IndexBody.cpp Modified: cfe/trunk/lib/Index/IndexBody.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Index/IndexBody.cpp?rev=285647&r1=285646&r2=285647&view=diff ============================================================================== --- cfe/trunk/lib/Index/IndexBody.cpp (original) +++ cfe/trunk/lib/Index/IndexBody.cpp Mon Oct 31 17:12:12 2016 @@ -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()) Added: cfe/trunk/test/Index/Core/designated-inits.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/Core/designated-inits.c?rev=285647&view=auto ============================================================================== --- cfe/trunk/test/Index/Core/designated-inits.c (added) +++ cfe/trunk/test/Index/Core/designated-inits.c Mon Oct 31 17:12:12 2016 @@ -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 | + }, + }, + }, + }, + }, +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits