> On Oct 31, 2016, at 4:49 PM, Richard Smith <rich...@metafoo.co.uk> wrote:
> 
> On Mon, Oct 31, 2016 at 3:12 PM, Argyrios Kyrtzidis via cfe-commits 
> <cfe-commits@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>> wrote:
> Author: akirtzidis
> Date: Mon Oct 31 17:12:12 2016
> New Revision: 285647
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=285647&view=rev 
> <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
>  
> <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,
> 
> Do we need SyntacticFromIndexer to be a RecursiveASTVisitor at all? It looks 
> like you would get the desired effect by simply walking the elements of the 
> syntactic form looking for DesignatedInitExprs (which will always be at the 
> top level of the InitListExpr's element if they exist). Right now, it looks 
> like you still traverse expression E twice in cases like this:
> 
>   int arr[] = { [0] = 0, E };
> 
> ... and you'd still get a quadratic traversal for a case like { [0] = {}, { 
> [0] = {}, { [0] = {}, ... } } }.

This is excellent feedback, see r285666.
Thanks for reviewing!

>  
> @@ -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
>  
> <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 <mailto:cfe-commits@lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits 
> <http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits>
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to