diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp
index 23d2597..3b17414 100644
--- a/tools/libclang/CIndex.cpp
+++ b/tools/libclang/CIndex.cpp
@@ -136,7 +136,8 @@
 public:
   enum Kind { DeclVisitKind, StmtVisitKind, MemberExprPartsKind,
               TypeLocVisitKind, OverloadExprPartsKind,
-              DeclRefExprPartsKind, LabelRefVisitKind };
+              DeclRefExprPartsKind, LabelRefVisitKind,
+              ExplicitTemplateArgsVisitKind };
 protected:
   void *dataA;
   void *dataB;
@@ -1638,6 +1639,8 @@
 DEF_JOB(MemberExprParts, MemberExpr, MemberExprPartsKind)
 DEF_JOB(DeclRefExprParts, DeclRefExpr, DeclRefExprPartsKind)
 DEF_JOB(OverloadExprParts, OverloadExpr, OverloadExprPartsKind)
+DEF_JOB(ExplicitTemplateArgsVisit, ExplicitTemplateArgumentList, 
+        ExplicitTemplateArgsVisitKind)
 #undef DEF_JOB
 
 class DeclVisit : public VisitorJob {
@@ -1651,7 +1654,6 @@
   Decl *get() const { return static_cast<Decl*>(dataA); }
   bool isFirst() const { return dataB ? true : false; }
 };
-
 class TypeLocVisit : public VisitorJob {
 public:
   TypeLocVisit(TypeLoc tl, CXCursor parent) :
@@ -1718,6 +1720,7 @@
   void VisitVAArgExpr(VAArgExpr *E);
 
 private:
+  void AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A);
   void AddStmt(Stmt *S);
   void AddDecl(Decl *D, bool isFirst = true);
   void AddTypeLoc(TypeSourceInfo *TI);
@@ -1733,6 +1736,12 @@
   if (D)
     WL.push_back(DeclVisit(D, Parent, isFirst));
 }
+void EnqueueVisitor::
+  AddExplicitTemplateArgs(const ExplicitTemplateArgumentList *A) {
+  if (A)
+    WL.push_back(ExplicitTemplateArgsVisit(
+                        const_cast<ExplicitTemplateArgumentList*>(A), Parent));
+}
 void EnqueueVisitor::AddTypeLoc(TypeSourceInfo *TI) {
   if (TI)
     WL.push_back(TypeLocVisit(TI->getTypeLoc(), Parent));
@@ -1800,6 +1809,9 @@
   AddTypeLoc(E->getTypeSourceInfo());
 }
 void EnqueueVisitor::VisitDeclRefExpr(DeclRefExpr *DR) {
+  if (DR->hasExplicitTemplateArgs()) {
+    AddExplicitTemplateArgs(&DR->getExplicitTemplateArgs());
+  }
   WL.push_back(DeclRefExprParts(DR, Parent));
 }
 void EnqueueVisitor::VisitDeclStmt(DeclStmt *S) {
@@ -1855,6 +1867,7 @@
   AddTypeLoc(M->getClassReceiverTypeInfo());
 }
 void EnqueueVisitor::VisitOverloadExpr(OverloadExpr *E) {
+  AddExplicitTemplateArgs(E->getOptionalExplicitTemplateArgs());
   WL.push_back(OverloadExprParts(E, Parent));
 }
 void EnqueueVisitor::VisitStmt(Stmt *S) {
@@ -1919,6 +1932,17 @@
 
         continue;
       }
+      case VisitorJob::ExplicitTemplateArgsVisitKind: {
+        const ExplicitTemplateArgumentList *ArgList =
+          cast<ExplicitTemplateArgsVisit>(&LI)->get();
+        for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
+               *ArgEnd = Arg + ArgList->NumTemplateArgs;
+               Arg != ArgEnd; ++Arg) {
+          if (VisitTemplateArgumentLoc(*Arg))
+            return true;
+        }
+        continue;
+      }
       case VisitorJob::TypeLocVisitKind: {
         // Perform default visitation for TypeLocs.
         if (Visit(cast<TypeLocVisit>(&LI)->get()))
@@ -2005,15 +2029,6 @@
         // Visit declaration name.
         if (VisitDeclarationNameInfo(DR->getNameInfo()))
           return true;
-        // Visit explicitly-specified template arguments.
-        if (DR->hasExplicitTemplateArgs()) {
-          ExplicitTemplateArgumentList &Args = DR->getExplicitTemplateArgs();
-          for (TemplateArgumentLoc *Arg = Args.getTemplateArgs(),
-                 *ArgEnd = Arg + Args.NumTemplateArgs;
-               Arg != ArgEnd; ++Arg)
-            if (VisitTemplateArgumentLoc(*Arg))
-              return true;
-        }
         continue;
       }
       case VisitorJob::OverloadExprPartsKind: {
@@ -2028,16 +2043,6 @@
         // Visit the overloaded declaration reference.
         if (Visit(MakeCursorOverloadedDeclRef(O, TU)))
           return true;
-        // Visit the explicitly-specified template arguments.
-        if (const ExplicitTemplateArgumentList *ArgList
-                                      = O->getOptionalExplicitTemplateArgs()) {
-          for (const TemplateArgumentLoc *Arg = ArgList->getTemplateArgs(),
-                 *ArgEnd = Arg + ArgList->NumTemplateArgs;
-               Arg != ArgEnd; ++Arg) {
-            if (VisitTemplateArgumentLoc(*Arg))
-              return true;
-          }
-        }
         continue;
       }
     }
