120 lines · cpp
1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -Wno-unreachable-code -Werror -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s2 3int val = 42;4int& test1() {5 return throw val, val;6}7 8int test2() {9 return val ? throw val : val;10}11 12void test3() {13 throw false;14}15 16// PR1058217int test4() {18 return 1 ? throw val : val;19}20 21// PR1592322int test5(bool x, bool y, int z) {23 return (x ? throw 1 : y) ? z : throw 2;24}25// CHECK-LABEL: define{{.*}} i32 @_Z5test5bbi(26// CHECK: br i127//28// x.true:29// CHECK: call void @__cxa_throw(30// CHECK-NEXT: unreachable31//32// x.false:33// CHECK: br i134//35// y.true:36// CHECK: load i32, ptr37// CHECK: br label38//39// y.false:40// CHECK: call void @__cxa_throw(41// CHECK-NEXT: unreachable42//43// end:44// CHECK: ret i3245 46int test6(bool x, bool y, int z) {47 return (x ? throw 1 : y) ? z : (throw 2);48}49// CHECK-LABEL: define{{.*}} i32 @_Z5test6bbi(50// CHECK: br i151//52// x.true:53// CHECK: call void @__cxa_throw(54// CHECK-NEXT: unreachable55//56// x.false:57// CHECK: br i158//59// y.true:60// CHECK: load i32, ptr61// CHECK: br label62//63// y.false:64// CHECK: call void @__cxa_throw(65// CHECK-NEXT: unreachable66//67// end:68// CHECK: ret i3269 70namespace DR1560 {71 struct A {72 ~A();73 };74 extern bool b;75 A get();76 // CHECK-LABEL: @_ZN6DR15601bE77 const A &r = b ? get() : throw 0;78 // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev79 // CHECK: call {{.*}} @__cxa_atexit(ptr @_ZN6DR15601AD1Ev, ptr @_ZGRN6DR15601rE80 // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev81 82 // PR2818483 void conditional_throw() {84 int a;85 (true ? throw 0 : a) = 0; // CHECK: call void @__cxa_throw({{.*}})86 }87}88 89// CHECK-LABEL: define{{.*}} void @_Z5test7b(90void test7(bool cond) {91 // CHECK: br i192 //93 // x.true:94 // CHECK: call void @__cxa_throw(95 // CHECK-NEXT: unreachable96 //97 // x.false:98 // CHECK: br label99 //100 // end:101 // CHECK: ret void102 cond ? throw test7 : val;103}104 105// CHECK-LABEL: define{{.*}} nonnull align 4 dereferenceable(4) ptr @_Z5test8b(106int &test8(bool cond) {107 // CHECK: br i1108 //109 // x.true:110 // CHECK: br label111 //112 // x.false:113 // CHECK: call void @__cxa_throw(114 // CHECK-NEXT: unreachable115 //116 // end:117 // CHECK: ret ptr @val118 return cond ? val : ((throw "foo"));119}120