brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 807c460 Raw
120 lines · cpp
1// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -Wno-unreachable-code -Werror -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s2 3int val = 42;4int& test1() {5  return throw val, val;6}7 8int test2() {9  return val ? throw val : val;10}11 12void test3() {13  throw false;14}15 16// PR1058217int test4() {18  return 1 ? throw val : val;19}20 21// PR1592322int 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 i127//28// x.true:29// CHECK: call void @__cxa_throw(30// CHECK-NEXT: unreachable31//32// x.false:33// CHECK: br i134//35// y.true:36// CHECK: load i32, ptr37// CHECK: br label38//39// y.false:40// CHECK: call void @__cxa_throw(41// CHECK-NEXT: unreachable42//43// end:44// CHECK: ret i3245 46int 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 i151//52// x.true:53// CHECK: call void @__cxa_throw(54// CHECK-NEXT: unreachable55//56// x.false:57// CHECK: br i158//59// y.true:60// CHECK: load i32, ptr61// CHECK: br label62//63// y.false:64// CHECK: call void @__cxa_throw(65// CHECK-NEXT: unreachable66//67// end:68// CHECK: ret i3269 70namespace DR1560 {71  struct A {72    ~A();73  };74  extern bool b;75  A get();76  // CHECK-LABEL: @_ZN6DR15601bE77  const A &r = b ? get() : throw 0;78  // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev79  // CHECK: call {{.*}} @__cxa_atexit(ptr @_ZN6DR15601AD1Ev, ptr @_ZGRN6DR15601rE80  // CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev81 82  // PR2818483  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(90void test7(bool cond) {91  // CHECK: br i192  //93  // x.true:94  // CHECK: call void @__cxa_throw(95  // CHECK-NEXT: unreachable96  //97  // x.false:98  // CHECK: br label99  //100  // end:101  // CHECK: ret void102  cond ? throw test7 : val;103}104 105// CHECK-LABEL: define{{.*}} nonnull align 4 dereferenceable(4) ptr @_Z5test8b(106int &test8(bool cond) {107  // CHECK: br i1108  //109  // x.true:110  // CHECK: br label111  //112  // x.false:113  // CHECK: call void @__cxa_throw(114  // CHECK-NEXT: unreachable115  //116  // end:117  // CHECK: ret ptr @val118  return cond ? val : ((throw "foo"));119}120