diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 3d8d8796..97d77366 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -874,14 +874,31 @@ static bool IsRecordValid(const clang::RecordDecl* RC) return IsRecordValid(RC, Visited); } -static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::QualType& Ty) { +static clang::CXXRecordDecl* GetCXXRecordDeclFromTemplateName(const clang::TemplateName& Name) +{ + using namespace clang; + + switch (Name.getKind()) { + case clang::TemplateName::Template: + return dyn_cast<clang::CXXRecordDecl>( + Name.getAsTemplateDecl()->getTemplatedDecl()); + case clang::TemplateName::QualifiedTemplate: + return dyn_cast<clang::CXXRecordDecl>( + Name.getAsQualifiedTemplateName()->getTemplateDecl()->getTemplatedDecl()); + default: + assert(0 && "Unknown template name kind"); + return nullptr; + } +} + +static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::QualType& Ty) +{ using namespace clang; if (auto RT = Ty->getAs<clang::RecordType>()) return dyn_cast<clang::CXXRecordDecl>(RT->getDecl()); else if (auto TST = Ty->getAs<clang::TemplateSpecializationType>()) - return dyn_cast<clang::CXXRecordDecl>( - TST->getTemplateName().getAsTemplateDecl()->getTemplatedDecl()); + return GetCXXRecordDeclFromTemplateName(TST->getTemplateName()); else if (auto Injected = Ty->getAs<clang::InjectedClassNameType>()) return Injected->getDecl();