diff options
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 6 | ||||
-rw-r--r-- | test/CXX/except/except.spec/p14-ir.cpp | 36 | ||||
-rw-r--r-- | test/CodeGenCXX/destructors.cpp | 15 |
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 |