From dac3753c0c3386100e056e36dde38e50cdc423b1 Mon Sep 17 00:00:00 2001
From: Joao Matos <joao@tritao.eu>
Date: Tue, 26 Sep 2017 00:13:39 +0100
Subject: [PATCH] Fixed parser bug when dealing with
 DependentTemplateSpecializationTypeLoc.

---
 src/CppParser/Parser.cpp | 9 +++++----
 src/CppParser/Parser.h   | 3 ++-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp
index 3f2d53cc..69083864 100644
--- a/src/CppParser/Parser.cpp
+++ b/src/CppParser/Parser.cpp
@@ -1220,9 +1220,10 @@ NonTypeTemplateParameter* Parser::WalkNonTypeTemplateParameter(const clang::NonT
 
 //-----------------------------------//
 
+template<typename TypeLoc>
 std::vector<CppSharp::CppParser::TemplateArgument>
 Parser::WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL,
-    clang::TemplateSpecializationTypeLoc* TSTL)
+    TypeLoc* TSTL)
 {
     using namespace clang;
 
@@ -2433,11 +2434,11 @@ Type* Parser::WalkType(clang::QualType QualType, const clang::TypeLoc* TL,
             assert(TL->getTypeLocClass() == TypeLoc::DependentTemplateSpecialization);
         }
 
-        TemplateSpecializationTypeLoc TSpecTL;
-        TemplateSpecializationTypeLoc *TSTL = 0;
+        DependentTemplateSpecializationTypeLoc TSpecTL;
+        DependentTemplateSpecializationTypeLoc *TSTL = 0;
         if (LocValid)
         {
-            TSpecTL = TL->getAs<TemplateSpecializationTypeLoc>();
+            TSpecTL = TL->getAs<DependentTemplateSpecializationTypeLoc>();
             TSTL = &TSpecTL;
         }
 
diff --git a/src/CppParser/Parser.h b/src/CppParser/Parser.h
index 703588d3..9f4d167a 100644
--- a/src/CppParser/Parser.h
+++ b/src/CppParser/Parser.h
@@ -101,7 +101,8 @@ private:
     WalkVarTemplateSpecialization(const clang::VarTemplateSpecializationDecl* VTS);
     VarTemplatePartialSpecialization*
     WalkVarTemplatePartialSpecialization(const clang::VarTemplatePartialSpecializationDecl* VTS);
-    std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, clang::TemplateSpecializationTypeLoc* TSTL);
+    template<typename TypeLoc>
+    std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, TypeLoc* TSTL);
     std::vector<TemplateArgument> WalkTemplateArgumentList(const clang::TemplateArgumentList* TAL, const clang::ASTTemplateArgumentListInfo* TSTL);
     void WalkVTable(const clang::CXXRecordDecl* RD, Class* C);
     QualifiedType GetQualifiedType(const clang::QualType& qual, const clang::TypeLoc* TL = 0);