Home | History | Annotate | Download | only in CodeGenCXX
      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