]> granicus.if.org Git - clang/commitdiff
Don't crash when an explicit template instantiation has no user-written
authorNick Lewycky <nicholas@mxc.ca>
Thu, 22 Jul 2010 17:56:53 +0000 (17:56 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Thu, 22 Jul 2010 17:56:53 +0000 (17:56 +0000)
arguments. This happens in clang itself where template:

  template <typename T> 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

include/clang/AST/RecursiveASTVisitor.h

index fc6219779423bacefa03eee8d504af29424f2347..0b56772c97dfb5d2d815b24fa830e9cbcc0c8689 100644 (file)
@@ -1318,9 +1318,13 @@ bool RecursiveASTVisitor<Derived>::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()));
+      }
     }
   }