]> granicus.if.org Git - clang/commitdiff
Fix a crash I introduced in r159212.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 27 Jun 2012 17:44:39 +0000 (17:44 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 27 Jun 2012 17:44:39 +0000 (17:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159279 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/DeclCXX.cpp
lib/Sema/SemaExpr.cpp
test/CodeGenCXX/devirtualize-virtual-function-calls.cpp

index a8aabb68d759c894e89876a034036e15d5c4eca6..4de157e9f5a4eba05d8759cedcd697b994001669 100644 (file)
@@ -1290,7 +1290,7 @@ CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD) {
   // Lookup doesn't work for destructors, so handle them separately.
   if (isa<CXXDestructorDecl>(this)) {
     CXXMethodDecl *MD = RD->getDestructor();
-    if (recursivelyOverrides(MD, this))
+    if (MD && recursivelyOverrides(MD, this))
       return MD;
     return NULL;
   }
index 4dd6f0b5524af31e52ca853ea06f07491f47d9f0..bc77e6fae7e87f18637192862c2d75ccb3ce3825 100644 (file)
@@ -10859,6 +10859,8 @@ static void MarkExprReferenced(Sema &SemaRef, SourceLocation Loc,
   if (!MostDerivedClassDecl)
     return;
   CXXMethodDecl *DM = MD->getCorrespondingMethodInClass(MostDerivedClassDecl);
+  if (!DM)
+    return;
   SemaRef.MarkAnyDeclReferenced(Loc, DM);
 } 
 
index a0b6e8c6bda68a4447b18fc623147470823c71d1..c5a4094a53c3001f43391b179b381ec95b525cdf 100644 (file)
@@ -71,3 +71,15 @@ namespace test2 {
     b->foo::~foo();
   }
 }
+
+namespace test3 {
+  // Test that we don't crash in this case.
+  struct B {
+  };
+  struct D : public B {
+  };
+  void f(D d) {
+    // CHECK: define void @_ZN5test31fENS_1DE
+    d.B::~B();
+  }
+}