From 103c8242f5c72fcddf9797108aa2bf467075cfaa Mon Sep 17 00:00:00 2001 From: malte_langkabel Date: Wed, 16 Dec 2015 13:27:00 +0100 Subject: [PATCH] logic: fixed template argument parsing crash * handled case when clang doesn't know the source info of an explicitly specified template argument :( --- src/lib_parser/data/parser/cxx/ASTVisitor.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/lib_parser/data/parser/cxx/ASTVisitor.cpp b/src/lib_parser/data/parser/cxx/ASTVisitor.cpp index 5eaa34f0..6b7dc3ec 100644 --- a/src/lib_parser/data/parser/cxx/ASTVisitor.cpp +++ b/src/lib_parser/data/parser/cxx/ASTVisitor.cpp @@ -786,16 +786,23 @@ void ASTVisitor::processTemplateArgumentsOfExplicitSpecialization(clang::ClassTe getParseLocationForTokensInRange(argumentLoc.getSourceRange()), argumentNameHierarchy, specializedRecordNameHierarchy - ); + ); } } } else { - clang::TypeLoc loc = specializationDecl->getTypeAsWritten()->getTypeLoc(); - if (loc.getTypeLocClass() == clang::TypeLoc::TypeLocClass::TemplateSpecialization) + if (clang::TypeSourceInfo* typeSourceInfo = specializationDecl->getTypeAsWritten()) { - processTemplateArguments(loc.getAs()); + clang::TypeLoc loc = typeSourceInfo->getTypeLoc(); + if (loc.getTypeLocClass() == clang::TypeLoc::TypeLocClass::TemplateSpecialization) + { + processTemplateArguments(loc.getAs()); + } + } + else + { + LOG_WARNING("Could not locate template arguments of explicit template specialization: " + specializedRecordNameHierarchy.getFullName()); } } }