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