r228144 - Rewrite r228138 to be somewhat saner.

Argyrios Kyrtzidis kyrtzidis at apple.com
Sun Feb 22 13:13:19 PST 2015


Hi Daniel,

Your change to always visit both syntactic and semantic forms of InitListExprs, by default, has downsides:

- It may be surprising and undesirable for some RecursiveASTVisitor clients that they see the same nodes visited twice
- It can trigger exponential behavior, significantly degrading performance with huge initializer exprs; for example try visiting "llvm/src/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp” (and look into what 'lib/Target/X86/X86GenDisassemblerTables.inc’ contains).

How about we make TraverseInitListExpr(InitListExpr *S) visit the semantic form only by default and add something like “visitationForInitLists()” that returns an enum for semantic/syntactic/both allowing RecursiveASTVisitor clients to control this ?

> On Feb 4, 2015, at 6:29 AM, Daniel Jasper <djasper at google.com> wrote:
> 
> Author: djasper
> Date: Wed Feb  4 08:29:47 2015
> New Revision: 228144
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=228144&view=rev
> Log:
> Rewrite r228138 to be somewhat saner.
> 
> While probably technically correct, the solution r228138 was quite hard
> to read/understand. This should be simpler.
> 
> Also added a test to ensure that we are still visiting the syntactic form
> as well.
> 
> Modified:
>    cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
>    cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp
> 
> Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=228144&r1=228143&r2=228144&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original)
> +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Wed Feb  4 08:29:47 2015
> @@ -2032,20 +2032,21 @@ DEF_TRAVERSE_STMT(CXXStaticCastExpr, {
> // to the syntactic form.
> template <typename Derived>
> bool RecursiveASTVisitor<Derived>::TraverseInitListExpr(InitListExpr *S) {
> -  if (InitListExpr *Syn = S->getSyntacticForm())
> -    S = Syn;
> -  TRY_TO(WalkUpFromInitListExpr(S));
> -  // All we need are the default actions.  FIXME: use a helper function.
> -  for (Stmt::child_range range = S->children(); range; ++range) {
> -    TRY_TO(TraverseStmt(*range));
> -  }
> -  if (InitListExpr *Syn = S->getSemanticForm()) {
> +  InitListExpr *Syn = S->isSemanticForm() ? S->getSyntacticForm() : S;
> +  if (Syn) {
>     TRY_TO(WalkUpFromInitListExpr(Syn));
>     // All we need are the default actions.  FIXME: use a helper function.
>     for (Stmt::child_range range = Syn->children(); range; ++range) {
>       TRY_TO(TraverseStmt(*range));
>     }
>   }
> +  InitListExpr *Sem = S->isSemanticForm() ? S : S->getSemanticForm();
> +  if (Sem) {
> +    TRY_TO(WalkUpFromInitListExpr(Sem));
> +    for (Stmt::child_range range = Sem->children(); range; ++range) {
> +      TRY_TO(TraverseStmt(*range));
> +    }
> +  }
>   return true;
> }
> 
> 
> Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp?rev=228144&r1=228143&r2=228144&view=diff
> ==============================================================================
> --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp (original)
> +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTest.cpp Wed Feb  4 08:29:47 2015
> @@ -3148,6 +3148,8 @@ TEST(InitListExpression, MatchesInitList
>                       "void f();"
>                       "S s[1] = { &f };",
>                       declRefExpr(to(functionDecl(hasName("f"))))));
> +  EXPECT_TRUE(
> +      matches("int i[1] = {42, [0] = 43};", integerLiteral(equals(42))));
> }
> 
> TEST(UsingDeclaration, MatchesUsingDeclarations) {
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits





More information about the cfe-commits mailing list