xref: /aosp_15_r20/external/clang/test/CodeGenCXX/throw-expressions.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -Wno-unreachable-code -Werror -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li int val = 42;
test1()4*67e74705SXin Li int& test1() {
5*67e74705SXin Li   return throw val, val;
6*67e74705SXin Li }
7*67e74705SXin Li 
test2()8*67e74705SXin Li int test2() {
9*67e74705SXin Li   return val ? throw val : val;
10*67e74705SXin Li }
11*67e74705SXin Li 
12*67e74705SXin Li // rdar://problem/8608801
test3()13*67e74705SXin Li void test3() {
14*67e74705SXin Li   throw false;
15*67e74705SXin Li }
16*67e74705SXin Li 
17*67e74705SXin Li // PR10582
test4()18*67e74705SXin Li int test4() {
19*67e74705SXin Li   return 1 ? throw val : val;
20*67e74705SXin Li }
21*67e74705SXin Li 
22*67e74705SXin Li // PR15923
test5(bool x,bool y,int z)23*67e74705SXin Li int test5(bool x, bool y, int z) {
24*67e74705SXin Li   return (x ? throw 1 : y) ? z : throw 2;
25*67e74705SXin Li }
26*67e74705SXin Li // CHECK-LABEL: define i32 @_Z5test5bbi(
27*67e74705SXin Li // CHECK: br i1
28*67e74705SXin Li //
29*67e74705SXin Li // x.true:
30*67e74705SXin Li // CHECK: call void @__cxa_throw(
31*67e74705SXin Li // CHECK-NEXT: unreachable
32*67e74705SXin Li //
33*67e74705SXin Li // x.false:
34*67e74705SXin Li // CHECK: br i1
35*67e74705SXin Li //
36*67e74705SXin Li // y.true:
37*67e74705SXin Li // CHECK: load i32, i32*
38*67e74705SXin Li // CHECK: br label
39*67e74705SXin Li //
40*67e74705SXin Li // y.false:
41*67e74705SXin Li // CHECK: call void @__cxa_throw(
42*67e74705SXin Li // CHECK-NEXT: unreachable
43*67e74705SXin Li //
44*67e74705SXin Li // end:
45*67e74705SXin Li // CHECK: ret i32
46*67e74705SXin Li 
test6(bool x,bool y,int z)47*67e74705SXin Li int test6(bool x, bool y, int z) {
48*67e74705SXin Li   return (x ? throw 1 : y) ? z : (throw 2);
49*67e74705SXin Li }
50*67e74705SXin Li // CHECK-LABEL: define i32 @_Z5test6bbi(
51*67e74705SXin Li // CHECK: br i1
52*67e74705SXin Li //
53*67e74705SXin Li // x.true:
54*67e74705SXin Li // CHECK: call void @__cxa_throw(
55*67e74705SXin Li // CHECK-NEXT: unreachable
56*67e74705SXin Li //
57*67e74705SXin Li // x.false:
58*67e74705SXin Li // CHECK: br i1
59*67e74705SXin Li //
60*67e74705SXin Li // y.true:
61*67e74705SXin Li // CHECK: load i32, i32*
62*67e74705SXin Li // CHECK: br label
63*67e74705SXin Li //
64*67e74705SXin Li // y.false:
65*67e74705SXin Li // CHECK: call void @__cxa_throw(
66*67e74705SXin Li // CHECK-NEXT: unreachable
67*67e74705SXin Li //
68*67e74705SXin Li // end:
69*67e74705SXin Li // CHECK: ret i32
70*67e74705SXin Li 
71*67e74705SXin Li namespace DR1560 {
72*67e74705SXin Li   struct A {
73*67e74705SXin Li     ~A();
74*67e74705SXin Li   };
75*67e74705SXin Li   extern bool b;
76*67e74705SXin Li   A get();
77*67e74705SXin Li   // CHECK-LABEL: @_ZN6DR15601bE
78*67e74705SXin Li   const A &r = b ? get() : throw 0;
79*67e74705SXin Li   // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev
80*67e74705SXin Li   // CHECK: call {{.*}} @__cxa_atexit({{.*}} @_ZN6DR15601AD1Ev {{.*}} @_ZGRN6DR15601rE
81*67e74705SXin Li   // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev
82*67e74705SXin Li }
83*67e74705SXin Li 
84*67e74705SXin Li // CHECK-LABEL: define void @_Z5test7b(
test7(bool cond)85*67e74705SXin Li void test7(bool cond) {
86*67e74705SXin Li   // CHECK: br i1
87*67e74705SXin Li   //
88*67e74705SXin Li   // x.true:
89*67e74705SXin Li   // CHECK: call void @__cxa_throw(
90*67e74705SXin Li   // CHECK-NEXT: unreachable
91*67e74705SXin Li   //
92*67e74705SXin Li   // x.false:
93*67e74705SXin Li   // CHECK: br label
94*67e74705SXin Li   //
95*67e74705SXin Li   // end:
96*67e74705SXin Li   // CHECK: ret void
97*67e74705SXin Li   cond ? throw test7 : val;
98*67e74705SXin Li }
99*67e74705SXin Li 
100*67e74705SXin Li // CHECK-LABEL: define dereferenceable(4) i32* @_Z5test8b(
test8(bool cond)101*67e74705SXin Li int &test8(bool cond) {
102*67e74705SXin Li   // CHECK: br i1
103*67e74705SXin Li   //
104*67e74705SXin Li   // x.true:
105*67e74705SXin Li   // CHECK: br label
106*67e74705SXin Li   //
107*67e74705SXin Li   // x.false:
108*67e74705SXin Li   // CHECK: call void @__cxa_throw(
109*67e74705SXin Li   // CHECK-NEXT: unreachable
110*67e74705SXin Li   //
111*67e74705SXin Li   // end:
112*67e74705SXin Li   // CHECK: ret i32* @val
113*67e74705SXin Li   return cond ? val : ((throw "foo"));
114*67e74705SXin Li }
115