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