aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/CGCall.cpp6
-rw-r--r--test/CXX/except/except.spec/p14-ir.cpp36
-rw-r--r--test/CodeGenCXX/destructors.cpp15
3 files changed, 31 insertions, 26 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp
index 0a17e56d72..1632cb3c22 100644
--- a/lib/CodeGen/CGCall.cpp
+++ b/lib/CodeGen/CGCall.cpp
@@ -684,6 +684,12 @@ void CodeGenModule::ConstructAttributeList(const CGFunctionInfo &FI,
if (TargetDecl) {
if (TargetDecl->hasAttr<NoThrowAttr>())
FuncAttrs |= llvm::Attribute::NoUnwind;
+ else if (const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
+ const FunctionProtoType *FPT = Fn->getType()->getAs<FunctionProtoType>();
+ if (FPT && FPT->hasEmptyExceptionSpec())
+ FuncAttrs |= llvm::Attribute::NoUnwind;
+ }
+
if (TargetDecl->hasAttr<NoReturnAttr>())
FuncAttrs |= llvm::Attribute::NoReturn;
if (TargetDecl->hasAttr<ConstAttr>())
diff --git a/test/CXX/except/except.spec/p14-ir.cpp b/test/CXX/except/except.spec/p14-ir.cpp
index 4dd754b1f3..79d6f28479 100644
--- a/test/CXX/except/except.spec/p14-ir.cpp
+++ b/test/CXX/except/except.spec/p14-ir.cpp
@@ -27,18 +27,14 @@ struct X5 : X0, X4 { };
void test(X2 x2, X3 x3, X5 x5) {
// CHECK: define linkonce_odr void @_ZN2X2C1ERKS_
- // CHECK-NOT: }
- // CHECK: ret void
- // CHECK-NOT: }
- // CHECK: call void @__cxa_call_unexpected
- // CHECK: }
+ // CHECK: call void @_ZN2X2C2ERKS_({{.*}}) nounwind
+ // CHECK-NEXT: ret void
+ // CHECK-NEXT: }
X2 x2a(x2);
// CHECK: define linkonce_odr void @_ZN2X3C1ERKS_
- // CHECK-NOT: }
- // CHECK: ret void
- // CHECK-NOT: }
- // CHECK: call void @__cxa_call_unexpected
- // CHECK: }
+ // CHECK: call void @_ZN2X3C2ERKS_({{.*}}) nounwind
+ // CHECK-NEXT: ret void
+ // CHECK-NEXT: }
X3 x3a(x3);
// CHECK: define linkonce_odr void @_ZN2X5C1ERS_
// CHECK-NOT: call void @__cxa_call_unexpected
@@ -60,14 +56,20 @@ struct X9 : X6, X7 { };
void test() {
// CHECK: define linkonce_odr void @_ZN2X8C1Ev
- // CHECK-NOT: }
- // CHECK: ret void
- // CHECK-NOT: }
- // CHECK: call void @__cxa_call_unexpected
- // CHECK: }
+ // CHECK: call void @_ZN2X8C2Ev({{.*}}) nounwind
+ // CHECK-NEXT: ret void
X8();
// CHECK: define linkonce_odr void @_ZN2X9C1Ev
- // CHECK-NOT: call void @__cxa_call_unexpected
- // CHECK: ret void
+ // CHECK: call void @_ZN2X9C2Ev({{.*}}){{$}}
+ // CHECK-NEXT: ret void
X9();
+
+ // CHECK: define linkonce_odr void @_ZN2X9C2Ev
+ // CHECK: call void @_ZN2X6C2Ev({{.*}}) nounwind
+ // CHECK-NEXT: call void @_ZN2X7C2Ev({{.*}}){{$}}
+ // CHECK: ret void
+
+ // CHECK: define linkonce_odr void @_ZN2X8C2Ev
+ // CHECK: call void @_ZN2X6C2Ev({{.*}}) nounwind
+ // CHECK-NEXT: ret void
}
diff --git a/test/CodeGenCXX/destructors.cpp b/test/CodeGenCXX/destructors.cpp
index 965aea52ee..8efaf01f3c 100644
--- a/test/CodeGenCXX/destructors.cpp
+++ b/test/CodeGenCXX/destructors.cpp
@@ -45,7 +45,8 @@ namespace PR7526 {
allocator::~allocator() throw() { foo(); }
// CHECK: define linkonce_odr void @_ZN6PR752617allocator_derivedD1Ev
- // CHECK: call void @__cxa_call_unexpected
+ // CHECK-NOT: call void @__cxa_call_unexpected
+ // CHECK: }
void foo() {
allocator_derived ad;
}
@@ -268,13 +269,11 @@ namespace test5 {
// CHECK: define internal void @_ZN5test312_GLOBAL__N_11DD0Ev(
// CHECK: invoke void @_ZN5test312_GLOBAL__N_11DD1Ev(
- // CHECK: call void @_ZdlPv(
+ // CHECK: call void @_ZdlPv({{.*}}) nounwind
// CHECK: ret void
// CHECK: call i8* @llvm.eh.exception(
- // CHECK: invoke void @_ZdlPv
+ // CHECK: call void @_ZdlPv({{.*}}) nounwind
// CHECK: call void @_Unwind_Resume_or_Rethrow
- // CHECK: call i8* @llvm.eh.exception(
- // CHECK: call void @_ZSt9terminatev(
// Checked at top of file:
// @_ZN5test312_GLOBAL__N_11DD1Ev = alias internal {{.*}} @_ZN5test312_GLOBAL__N_11DD2Ev
@@ -295,13 +294,11 @@ namespace test5 {
// CHECK: define internal void @_ZN5test312_GLOBAL__N_11CD0Ev(
// CHECK: invoke void @_ZN5test312_GLOBAL__N_11CD1Ev(
- // CHECK: call void @_ZdlPv(
+ // CHECK: call void @_ZdlPv({{.*}}) nounwind
// CHECK: ret void
// CHECK: call i8* @llvm.eh.exception()
- // CHECK: invoke void @_ZdlPv(
+ // CHECK: call void @_ZdlPv({{.*}}) nounwind
// CHECK: call void @_Unwind_Resume_or_Rethrow(
- // CHECK: call i8* @llvm.eh.exception()
- // CHECK: call void @_ZSt9terminatev()
// CHECK: define internal void @_ZThn8_N5test312_GLOBAL__N_11CD1Ev(
// CHECK: getelementptr inbounds i8* {{.*}}, i64 -8