From: Nick Lewycky Date: Thu, 22 Jul 2010 17:56:53 +0000 (+0000) Subject: Don't crash when an explicit template instantiation has no user-written X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=44db3251aec7c0e6edaf1c70d7d53a272686791a;p=clang Don't crash when an explicit template instantiation has no user-written arguments. This happens in clang itself where template: template T const *getAs(); gets specialized with: template<> inline clang::TypedefType const *getAs() { ... } and there's no TemplateArgumentList. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109127 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/RecursiveASTVisitor.h b/include/clang/AST/RecursiveASTVisitor.h index fc62197794..0b56772c97 100644 --- a/include/clang/AST/RecursiveASTVisitor.h +++ b/include/clang/AST/RecursiveASTVisitor.h @@ -1318,9 +1318,13 @@ bool RecursiveASTVisitor::TraverseFunctionHelper(FunctionDecl *D) { D->getTemplateSpecializationInfo()) { if (FTSI->getTemplateSpecializationKind() != TSK_Undeclared && FTSI->getTemplateSpecializationKind() != TSK_ImplicitInstantiation) { - const TemplateArgumentListInfo *TALI = FTSI->TemplateArgumentsAsWritten; - TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getArgumentArray(), - TALI->size())); + // A specialization might not have explicit template arguments if it has + // a templated return type and concrete arguments. + if (const TemplateArgumentListInfo *TALI = + FTSI->TemplateArgumentsAsWritten) { + TRY_TO(TraverseTemplateArgumentLocsHelper(TALI->getArgumentArray(), + TALI->size())); + } } }