diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 680b4d1..bbceea9 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -343,7 +343,6 @@
   bool VisitAddrLabelExpr(AddrLabelExpr *E);
   bool VisitTypesCompatibleExpr(TypesCompatibleExpr *E);
   bool VisitVAArgExpr(VAArgExpr *E);
-  bool VisitInitListExpr(InitListExpr *E);
   bool VisitDesignatedInitExpr(DesignatedInitExpr *E);
   bool VisitCXXTypeidExpr(CXXTypeidExpr *E);
   bool VisitCXXUuidofExpr(CXXUuidofExpr *E);
@@ -366,11 +365,12 @@
   DATA_RECURSIVE_VISIT(CXXOperatorCallExpr)
   DATA_RECURSIVE_VISIT(DoStmt)
   DATA_RECURSIVE_VISIT(IfStmt)
+  DATA_RECURSIVE_VISIT(InitListExpr)
   DATA_RECURSIVE_VISIT(ForStmt)
   DATA_RECURSIVE_VISIT(MemberExpr)
   DATA_RECURSIVE_VISIT(SwitchStmt)
   DATA_RECURSIVE_VISIT(WhileStmt)
-  
+
   // Data-recursive visitor functions.
   bool IsInRegionOfInterest(CXCursor C);
   bool RunVisitorWorkList(VisitorWorkList &WL);
@@ -1587,14 +1587,6 @@
   return Visit(MakeCXCursor(E->getSubExpr(), StmtParent, TU));
 }
 
-bool CursorVisitor::VisitInitListExpr(InitListExpr *E) {
-  // We care about the syntactic form of the initializer list, only.
-  if (InitListExpr *Syntactic = E->getSyntacticForm())
-    return VisitExpr(Syntactic);
-
-  return VisitExpr(E);
-}
-
 bool CursorVisitor::VisitDesignatedInitExpr(DesignatedInitExpr *E) {
   // Visit the designators.
   typedef DesignatedInitExpr::Designator Designator;
@@ -1841,23 +1833,26 @@
 // Data-recursive visitor methods.
 //===----------------------------------------------------------------------===//
 
+static void EnqueueChildren(VisitorWorkList &WL, CXCursor Parent, Stmt *S) {
+  unsigned size = WL.size();
+  for (Stmt::child_iterator Child = S->child_begin(), ChildEnd = S->child_end();
+       Child != ChildEnd; ++Child) {
+    WLAddStmt(WL, Parent, *Child);
+  }
+  if (size == WL.size())
+    return;
+  // Now reverse the entries we just added.  This will match the DFS
+  // ordering performed by the worklist.
+  VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
+  std::reverse(I, E);
+}
+
 void CursorVisitor::EnqueueWorkList(VisitorWorkList &WL, Stmt *S) {
   CXCursor C = MakeCXCursor(S, StmtParent, TU);
   switch (S->getStmtClass()) {
-    default: {
-      unsigned size = WL.size();
-      for (Stmt::child_iterator Child = S->child_begin(),
-              ChildEnd = S->child_end(); Child != ChildEnd; ++Child) {
-        WLAddStmt(WL, C, *Child);
-      }
-      if (size == WL.size())
-        return;
-      // Now reverse the entries we just added.  This will match the DFS
-      // ordering performed by the worklist.
-      VisitorWorkList::iterator I = WL.begin() + size, E = WL.end();
-      std::reverse(I, E);
+    default:
+      EnqueueChildren(WL, C, S);
       break;
-    }
     case Stmt::CXXOperatorCallExprClass: {
       CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(S);
       // Note that we enqueue things in reverse order so that
@@ -1892,6 +1887,14 @@
       WLAddDecl(WL, C, If->getConditionVariable());      
       break;
     }
+    case Stmt::InitListExprClass: {
+      InitListExpr *IE = cast<InitListExpr>(S);
+      // We care about the syntactic form of the initializer list, only.
+      if (InitListExpr *Syntactic = IE->getSyntacticForm())
+        IE = Syntactic;
+      EnqueueChildren(WL, C, IE);
+      break;
+    }
     case Stmt::MemberExprClass: {
       MemberExpr *M = cast<MemberExpr>(S);
       WL.push_back(MemberExprParts(M, C));
@@ -1973,6 +1976,7 @@
           case Stmt::DoStmtClass:
           case Stmt::ForStmtClass:
           case Stmt::IfStmtClass:
+          case Stmt::InitListExprClass:
           case Stmt::MemberExprClass:
           case Stmt::ParenExprClass:
           case Stmt::SwitchStmtClass:
