diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index bbceea9..3c585ed 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -126,12 +126,15 @@
   
 class VisitorJob {
 public:
-  enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind };
+  enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind,
+              TypeLocVisitKind };
 protected:
-  void *data;
+  void *dataA;
+  void *dataB;
   CXCursor parent;
   Kind K;
-  VisitorJob(void *d, CXCursor C, Kind k) : data(d), parent(C), K(k) {}
+  VisitorJob(CXCursor C, Kind k, void *d1, void *d2 = 0)
+    : dataA(d1), dataB(d2), parent(C), K(k) {}
 public:
   Kind getKind() const { return K; }
   const CXCursor &getParent() const { return parent; }
@@ -143,9 +146,9 @@
 #define DEF_JOB(NAME, DATA, KIND)\
 class NAME : public VisitorJob {\
 public:\
-  NAME(DATA *d, CXCursor parent) : VisitorJob(d, parent, VisitorJob::KIND) {}\
+  NAME(DATA *d, CXCursor parent) : VisitorJob(parent, VisitorJob::KIND, d) {} \
   static bool classof(const VisitorJob *VJ) { return VJ->getKind() == KIND; }\
-  DATA *get() const { return static_cast<DATA*>(data); }\
+  DATA *get() const { return static_cast<DATA*>(dataA); }\
 };
 
 DEF_JOB(DeclVisit, Decl, DeclVisitKind)
@@ -153,6 +156,22 @@
 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
 #undef DEF_JOB
 
+class TypeLocVisit : public VisitorJob {
+public:
+  TypeLocVisit(TypeLoc tl, CXCursor parent) :
+    VisitorJob(parent, VisitorJob::TypeLocVisitKind,
+               tl.getType().getAsOpaquePtr(), tl.getOpaqueData()) {}
+
+  static bool classof(const VisitorJob *VJ) {
+    return VJ->getKind() == TypeLocVisitKind;
+  }
+
+  TypeLoc get() { 
+    QualType T = QualType::getFromOpaquePtr(dataA);
+    return TypeLoc(T, dataB);
+  }
+};
+
 static inline void WLAddStmt(VisitorWorkList &WL, CXCursor Parent, Stmt *S) {
   if (S)
     WL.push_back(StmtVisit(S, Parent));
@@ -161,6 +180,11 @@
   if (D)
     WL.push_back(DeclVisit(D, Parent));
 }
+static inline void WLAddTypeLoc(VisitorWorkList &WL, CXCursor Parent,
+                                TypeSourceInfo *TI) {
+  if (TI)
+    WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
+}
 
 // Cursor visitor.
 class CursorVisitor : public DeclVisitor<CursorVisitor, bool>,
@@ -334,7 +358,6 @@
   // Expression visitors
   bool VisitDeclRefExpr(DeclRefExpr *E);
   bool VisitBlockExpr(BlockExpr *B);
-  bool VisitCompoundLiteralExpr(CompoundLiteralExpr *E);
   bool VisitExplicitCastExpr(ExplicitCastExpr *E);
   bool VisitObjCMessageExpr(ObjCMessageExpr *E);
   bool VisitObjCEncodeExpr(ObjCEncodeExpr *E);
@@ -361,6 +384,7 @@
 #define DATA_RECURSIVE_VISIT(NAME)\
 bool Visit##NAME(NAME *S) { return VisitDataRecursive(S); }
   DATA_RECURSIVE_VISIT(BinaryOperator)
+  DATA_RECURSIVE_VISIT(CompoundLiteralExpr)
   DATA_RECURSIVE_VISIT(CXXMemberCallExpr)
   DATA_RECURSIVE_VISIT(CXXOperatorCallExpr)
   DATA_RECURSIVE_VISIT(DoStmt)
@@ -1563,14 +1587,6 @@
   return VisitCastExpr(E);
 }
 
-bool CursorVisitor::VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
-  if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo())
-    if (Visit(TSInfo->getTypeLoc()))
-      return true;
-
-  return VisitExpr(E);
-}
-
 bool CursorVisitor::VisitAddrLabelExpr(AddrLabelExpr *E) {
   return Visit(MakeCursorLabelRef(E->getLabel(), E->getLabelLoc(), TU));
 }
@@ -1853,6 +1869,12 @@
     default:
       EnqueueChildren(WL, C, S);
       break;
+    case Stmt::CompoundLiteralExprClass: {
+      CompoundLiteralExpr *CL = cast<CompoundLiteralExpr>(S);
+      EnqueueChildren(WL, C, CL);
+      WLAddTypeLoc(WL, C, CL->getTypeSourceInfo());
+      break;
+    }
     case Stmt::CXXOperatorCallExprClass: {
       CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(S);
       // Note that we enqueue things in reverse order so that
@@ -1951,6 +1973,12 @@
 
         continue;
       }
+      case VisitorJob::TypeLocVisitKind: {
+        // Perform default visitation for TypeLocs.
+        if (Visit(cast<TypeLocVisit>(LI).get()))
+          return true;
+        continue;
+      }
       case VisitorJob::StmtVisitKind: {
         Stmt *S = cast<StmtVisit>(LI).get();
         if (!S)
@@ -1969,6 +1997,7 @@
           case Stmt::BinaryOperatorClass:
           case Stmt::CallExprClass:
           case Stmt::CaseStmtClass:
+          case Stmt::CompoundLiteralExprClass:
           case Stmt::CompoundStmtClass:
           case Stmt::CXXMemberCallExprClass:
           case Stmt::CXXOperatorCallExprClass:
