blob: 4dd5322fba515e38734780105cbac422ebbcb908 [file] [log] [blame]
Richard Smith469a7472013-05-08 20:32:14 +00001// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -Wno-unreachable-code -Werror -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
Eli Friedmanf6c175b2009-12-07 20:25:53 +00002
3int val = 42;
4int& test1() {
5 return throw val, val;
6}
7
8int test2() {
9 return val ? throw val : val;
10}
John McCall077dc602010-10-29 08:14:02 +000011
12// rdar://problem/8608801
13void test3() {
14 throw false;
15}
Eli Friedman27ef75b2011-10-15 02:10:40 +000016
17// PR10582
18int test4() {
19 return 1 ? throw val : val;
20}
Richard Smithea852322013-05-07 21:53:22 +000021
22// PR15923
23int test5(bool x, bool y, int z) {
24 return (x ? throw 1 : y) ? z : throw 2;
25}
Stephen Lin43622612013-08-15 06:47:53 +000026// CHECK-LABEL: define i32 @_Z5test5bbi(
Richard Smithea852322013-05-07 21:53:22 +000027// 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*
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
David Majnemera9d4f772013-06-02 08:40:42 +000046
47int test6(bool x, bool y, int z) {
48 return (x ? throw 1 : y) ? z : (throw 2);
49}
Stephen Lin43622612013-08-15 06:47:53 +000050// CHECK-LABEL: define i32 @_Z5test6bbi(
David Majnemera9d4f772013-06-02 08:40:42 +000051// 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*
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
Richard Smith6a6a4bb2014-01-27 04:19:56 +000070
71namespace 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}
Richard Smithf3076ff2014-06-20 18:43:47 +000083
84// CHECK-LABEL: define void @_Z5test7b(
85void 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
Hal Finkela2347ba2014-07-18 15:52:10 +0000100// CHECK-LABEL: define dereferenceable(4) i32* @_Z5test8b(
Richard Smithf3076ff2014-06-20 18:43:47 +0000101int &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}