17ba376be6361bafbb1d26cfa03f976d0161cc639Richard Smith// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -Wno-unreachable-code -Werror -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
248daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman
348daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedmanint val = 42;
448daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedmanint& test1() {
548daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  return throw val, val;
648daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman}
748daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman
848daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedmanint test2() {
948daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman  return val ? throw val : val;
1048daf59c9f52856ca80074f1f5a30aa29c235726Eli Friedman}
1114e1bc9201681a52e06b0544ee800b422f6f3efeJohn McCall
1214e1bc9201681a52e06b0544ee800b422f6f3efeJohn McCall// rdar://problem/8608801
1314e1bc9201681a52e06b0544ee800b422f6f3efeJohn McCallvoid test3() {
1414e1bc9201681a52e06b0544ee800b422f6f3efeJohn McCall  throw false;
1514e1bc9201681a52e06b0544ee800b422f6f3efeJohn McCall}
16c8645e38bfe5ab46e424b7aaca53c064105c4265Eli Friedman
17c8645e38bfe5ab46e424b7aaca53c064105c4265Eli Friedman// PR10582
18c8645e38bfe5ab46e424b7aaca53c064105c4265Eli Friedmanint test4() {
19c8645e38bfe5ab46e424b7aaca53c064105c4265Eli Friedman  return 1 ? throw val : val;
20c8645e38bfe5ab46e424b7aaca53c064105c4265Eli Friedman}
214c71b8cded575b0cfc133c5da4502ca613982094Richard Smith
224c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// PR15923
234c71b8cded575b0cfc133c5da4502ca613982094Richard Smithint test5(bool x, bool y, int z) {
244c71b8cded575b0cfc133c5da4502ca613982094Richard Smith  return (x ? throw 1 : y) ? z : throw 2;
254c71b8cded575b0cfc133c5da4502ca613982094Richard Smith}
264c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: define i32 @_Z5test5bbi(
274c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: br i1
284c71b8cded575b0cfc133c5da4502ca613982094Richard Smith//
294c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// x.true:
304c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: call void @__cxa_throw(
314c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK-NEXT: unreachable
324c71b8cded575b0cfc133c5da4502ca613982094Richard Smith//
334c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// x.false:
344c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: br i1
354c71b8cded575b0cfc133c5da4502ca613982094Richard Smith//
364c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// y.true:
374c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: load i32*
384c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: br label
394c71b8cded575b0cfc133c5da4502ca613982094Richard Smith//
404c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// y.false:
414c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: call void @__cxa_throw(
424c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK-NEXT: unreachable
434c71b8cded575b0cfc133c5da4502ca613982094Richard Smith//
444c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// end:
454c71b8cded575b0cfc133c5da4502ca613982094Richard Smith// CHECK: ret i32
46c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer
47c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemerint test6(bool x, bool y, int z) {
48c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer  return (x ? throw 1 : y) ? z : (throw 2);
49c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer}
50c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: define i32 @_Z5test6bbi(
51c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: br i1
52c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer//
53c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// x.true:
54c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: call void @__cxa_throw(
55c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK-NEXT: unreachable
56c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer//
57c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// x.false:
58c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: br i1
59c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer//
60c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// y.true:
61c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: load i32*
62c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: br label
63c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer//
64c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// y.false:
65c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: call void @__cxa_throw(
66c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK-NEXT: unreachable
67c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer//
68c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// end:
69c063cb1e1a2e4b76f27762fcf56b4ba2ede8f0a9David Majnemer// CHECK: ret i32
70