|
|
|
@ -874,14 +874,31 @@ static bool IsRecordValid(const clang::RecordDecl* RC)
@@ -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(); |
|
|
|
|
|
|
|
|
|