Rewrite r228138 to be somewhat saner.
authorDaniel Jasper <djasper@google.com>
Wed, 4 Feb 2015 14:29:47 +0000 (14:29 +0000)
committerDaniel Jasper <djasper@google.com>
Wed, 4 Feb 2015 14:29:47 +0000 (14:29 +0000)
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.

llvm-svn: 228144

clang/include/clang/AST/RecursiveASTVisitor.h
clang/unittests/ASTMatchers/ASTMatchersTest.cpp

index 3db0eb7..ff8e74b 100644 (file)
@@ -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;
 }
 
index 7325e06..6485803 100644 (file)
@@ -3148,6 +3148,8 @@ TEST(InitListExpression, MatchesInitListExpression) {
                       "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) {