Fix noexcept for delete expressions.

Using "delete" on a pointer to an incomplete type can't throw.
While I'm here, clean up the signature of the canCalleeThrow() helper.

llvm-svn: 184810
This commit is contained in:
Eli Friedman 2013-06-25 01:24:22 +00:00
parent 36c17ee5a1
commit 0423b76be1
2 changed files with 9 additions and 7 deletions

View File

@ -790,11 +790,8 @@ static CanThrowResult canSubExprsThrow(Sema &S, const Expr *CE) {
return R;
}
static CanThrowResult canCalleeThrow(Sema &S, const Expr *E,
const Decl *D,
bool NullThrows = true) {
if (!D)
return NullThrows ? CT_Can : CT_Cannot;
static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D) {
assert(D && "Expected decl");
// See if we can get a function type from the decl somehow.
const ValueDecl *VD = dyn_cast<ValueDecl>(D);
@ -945,7 +942,9 @@ CanThrowResult Sema::canThrow(const Expr *E) {
cast<CXXDeleteExpr>(E)->getOperatorDelete());
if (const RecordType *RT = DTy->getAs<RecordType>()) {
const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
CT = mergeCanThrow(CT, canCalleeThrow(*this, E, RD->getDestructor()));
const CXXDestructorDecl *DD = RD->getDestructor();
if (DD)
CT = mergeCanThrow(CT, canCalleeThrow(*this, E, DD));
}
if (CT == CT_Can)
return CT;

View File

@ -1,4 +1,4 @@
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 -fms-extensions %s
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify -std=c++11 -fms-extensions -Wno-delete-incomplete %s
// expected-no-diagnostics
#define P(e) static_assert(noexcept(e), "expected nothrow")
@ -91,6 +91,8 @@ struct S2 {
void *operator new(__typeof__(sizeof(int)) sz, int) throw();
struct IncompleteStruct;
struct Bad1 {
~Bad1() throw(int);
};
@ -104,6 +106,7 @@ void implicits() {
N(new int);
P(new (0) int);
P(delete (int*)0);
P(delete (IncompleteStruct*)0);
N(delete (Bad1*)0);
N(delete (Bad2*)0);
N(S2());