// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -Wno-unreachable-code -Werror -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s int val = 42; int& test1() { return throw val, val; } int test2() { return val ? throw val : val; } // rdar://problem/8608801 void test3() { throw false; } // PR10582 int test4() { return 1 ? throw val : val; } // PR15923 int test5(bool x, bool y, int z) { return (x ? throw 1 : y) ? z : throw 2; } // CHECK-LABEL: define i32 @_Z5test5bbi( // CHECK: br i1 // // x.true: // CHECK: call void @__cxa_throw( // CHECK-NEXT: unreachable // // x.false: // CHECK: br i1 // // y.true: // CHECK: load i32, i32* // CHECK: br label // // y.false: // CHECK: call void @__cxa_throw( // CHECK-NEXT: unreachable // // end: // CHECK: ret i32 int test6(bool x, bool y, int z) { return (x ? throw 1 : y) ? z : (throw 2); } // CHECK-LABEL: define i32 @_Z5test6bbi( // CHECK: br i1 // // x.true: // CHECK: call void @__cxa_throw( // CHECK-NEXT: unreachable // // x.false: // CHECK: br i1 // // y.true: // CHECK: load i32, i32* // CHECK: br label // // y.false: // CHECK: call void @__cxa_throw( // CHECK-NEXT: unreachable // // end: // CHECK: ret i32 namespace DR1560 { struct A { ~A(); }; extern bool b; A get(); // CHECK-LABEL: @_ZN6DR15601bE const A &r = b ? get() : throw 0; // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN6DR15601AD1Ev {{.*}} @_ZGRN6DR15601rE // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev // PR28184 void conditional_throw() { int a; (true ? throw 0 : a) = 0; // CHECK: call void @__cxa_throw({{.*}}) } } // CHECK-LABEL: define void @_Z5test7b( void test7(bool cond) { // CHECK: br i1 // // x.true: // CHECK: call void @__cxa_throw( // CHECK-NEXT: unreachable // // x.false: // CHECK: br label // // end: // CHECK: ret void cond ? throw test7 : val; } // CHECK-LABEL: define nonnull align 4 dereferenceable(4) i32* @_Z5test8b( int &test8(bool cond) { // CHECK: br i1 // // x.true: // CHECK: br label // // x.false: // CHECK: call void @__cxa_throw( // CHECK-NEXT: unreachable // // end: // CHECK: ret i32* @val return cond ? val : ((throw "foo")); }