]> granicus.if.org Git - clang/commitdiff
Fix member function call with null 'this' pointer.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 19 Apr 2017 02:19:21 +0000 (02:19 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Wed, 19 Apr 2017 02:19:21 +0000 (02:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@300653 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Decl.cpp

index 9b5ba813dbda211378dd77c6ceed9dfba320670d..5fe0706521277cfb49de486a95d90223cef2afa4 100644 (file)
@@ -2253,6 +2253,7 @@ bool VarDecl::checkInitIsICE() const {
 
 template<typename DeclT>
 static DeclT *getDefinitionOrSelf(DeclT *D) {
+  assert(D);
   if (auto *Def = D->getDefinition())
     return Def;
   return D;
@@ -3202,9 +3203,12 @@ bool FunctionDecl::isTemplateInstantiation() const {
    
 FunctionDecl *FunctionDecl::getTemplateInstantiationPattern() const {
   // Handle class scope explicit specialization special case.
-  if (getTemplateSpecializationKind() == TSK_ExplicitSpecialization)
-    return getDefinitionOrSelf(getClassScopeSpecializationPattern());
-  
+  if (getTemplateSpecializationKind() == TSK_ExplicitSpecialization) {
+    if (auto *Spec = getClassScopeSpecializationPattern())
+      return getDefinitionOrSelf(Spec);
+    return nullptr;
+  }
+
   // If this is a generic lambda call operator specialization, its 
   // instantiation pattern is always its primary template's pattern
   // even if its primary template was instantiated from another