summaryrefslogtreecommitdiffstats
path: root/clang/lib/Index/IndexBody.cpp
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2016-10-31 22:12:12 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2016-10-31 22:12:12 +0000
commit67eda2ad1d2275bacbf4afb9f50b341aec6ca17d (patch)
treeb0ad21f71047ed31a5c17b2c65d9cb38ca08bbf1 /clang/lib/Index/IndexBody.cpp
parent5d51a769949a59e5cabf2a09a955d333d11dafa4 (diff)
downloadbcm5719-llvm-67eda2ad1d2275bacbf4afb9f50b341aec6ca17d.tar.gz
bcm5719-llvm-67eda2ad1d2275bacbf4afb9f50b341aec6ca17d.zip
[index] Fix repeated visitation of the same InitListExpr for indexing.
It was visited multiple times unnecessarily. rdar://28985038 llvm-svn: 285647
Diffstat (limited to 'clang/lib/Index/IndexBody.cpp')
-rw-r--r--clang/lib/Index/IndexBody.cpp17
1 files changed, 17 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())
OpenPOWER on IntegriCloud