aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2012-06-27 17:44:39 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2012-06-27 17:44:39 +0000
commit0713d993cd0b4eb6a1b642c7d51d0f1845c1e986 (patch)
treeac660576bbaacd51c15639b38dece5a8b64c87fc
parent962668d2c192dd02f75b8ec3628a89964bfb738b (diff)
Fix a crash I introduced in r159212.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159279 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AST/DeclCXX.cpp2
-rw-r--r--lib/Sema/SemaExpr.cpp2
-rw-r--r--test/CodeGenCXX/devirtualize-virtual-function-calls.cpp12
3 files changed, 15 insertions, 1 deletions
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp
index a8aabb68d7..4de157e9f5 100644
--- a/lib/AST/DeclCXX.cpp
+++ b/lib/AST/DeclCXX.cpp
@@ -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;
}
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 4dd6f0b552..bc77e6fae7 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -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);
}
diff --git a/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp b/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp
index a0b6e8c6bd..c5a4094a53 100644
--- a/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp
+++ b/test/CodeGenCXX/devirtualize-virtual-function-calls.cpp
@@ -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();
+ }
+}