This reverts commit d618f1c3b12effd0c2bdb7d02108d3551f389d3d. This commit wasn't reviewed ahead of time and significant concerns were raised immediately after it landed. According to our developer policy this warrants immediate revert of the commit. https://llvm.org/docs/DeveloperPolicy.html#patch-reversion-policy Differential Revision: https://reviews.llvm.org/D155509
121 lines
2.2 KiB
C++
121 lines
2.2 KiB
C++
// RUN: %clang_cc1 -fcxx-exceptions -fexceptions -Wno-unreachable-code -Werror -triple x86_64-linux-gnu -emit-llvm -o - %s | FileCheck %s
|
|
|
|
int val = 42;
|
|
int& test1() {
|
|
return throw val, val;
|
|
}
|
|
|
|
int test2() {
|
|
return val ? throw val : val;
|
|
}
|
|
|
|
// rdar://problem/8608801
|
|
void test3() {
|
|
throw false;
|
|
}
|
|
|
|
// PR10582
|
|
int test4() {
|
|
return 1 ? throw val : val;
|
|
}
|
|
|
|
// PR15923
|
|
int test5(bool x, bool y, int z) {
|
|
return (x ? throw 1 : y) ? z : throw 2;
|
|
}
|
|
// CHECK-LABEL: define{{.*}} i32 @_Z5test5bbi(
|
|
// CHECK: br i1
|
|
//
|
|
// x.true:
|
|
// CHECK: call void @__cxa_throw(
|
|
// CHECK-NEXT: unreachable
|
|
//
|
|
// x.false:
|
|
// CHECK: br i1
|
|
//
|
|
// y.true:
|
|
// CHECK: load i32, ptr
|
|
// CHECK: br label
|
|
//
|
|
// y.false:
|
|
// CHECK: call void @__cxa_throw(
|
|
// CHECK-NEXT: unreachable
|
|
//
|
|
// end:
|
|
// CHECK: ret i32
|
|
|
|
int test6(bool x, bool y, int z) {
|
|
return (x ? throw 1 : y) ? z : (throw 2);
|
|
}
|
|
// CHECK-LABEL: define{{.*}} i32 @_Z5test6bbi(
|
|
// CHECK: br i1
|
|
//
|
|
// x.true:
|
|
// CHECK: call void @__cxa_throw(
|
|
// CHECK-NEXT: unreachable
|
|
//
|
|
// x.false:
|
|
// CHECK: br i1
|
|
//
|
|
// y.true:
|
|
// CHECK: load i32, ptr
|
|
// CHECK: br label
|
|
//
|
|
// y.false:
|
|
// CHECK: call void @__cxa_throw(
|
|
// CHECK-NEXT: unreachable
|
|
//
|
|
// end:
|
|
// CHECK: ret i32
|
|
|
|
namespace DR1560 {
|
|
struct A {
|
|
~A();
|
|
};
|
|
extern bool b;
|
|
A get();
|
|
// CHECK-LABEL: @_ZN6DR15601bE
|
|
const A &r = b ? get() : throw 0;
|
|
// CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev
|
|
// CHECK: call {{.*}} @__cxa_atexit(ptr @_ZN6DR15601AD1Ev, ptr @_ZGRN6DR15601rE
|
|
// CHECK-NOT: call {{.*}}@_ZN6DR15601AD1Ev
|
|
|
|
// PR28184
|
|
void conditional_throw() {
|
|
int a;
|
|
(true ? throw 0 : a) = 0; // CHECK: call void @__cxa_throw({{.*}})
|
|
}
|
|
}
|
|
|
|
// CHECK-LABEL: define{{.*}} void @_Z5test7b(
|
|
void test7(bool cond) {
|
|
// CHECK: br i1
|
|
//
|
|
// x.true:
|
|
// CHECK: call void @__cxa_throw(
|
|
// CHECK-NEXT: unreachable
|
|
//
|
|
// x.false:
|
|
// CHECK: br label
|
|
//
|
|
// end:
|
|
// CHECK: ret void
|
|
cond ? throw test7 : val;
|
|
}
|
|
|
|
// CHECK-LABEL: define{{.*}} nonnull align 4 dereferenceable(4) ptr @_Z5test8b(
|
|
int &test8(bool cond) {
|
|
// CHECK: br i1
|
|
//
|
|
// x.true:
|
|
// CHECK: br label
|
|
//
|
|
// x.false:
|
|
// CHECK: call void @__cxa_throw(
|
|
// CHECK-NEXT: unreachable
|
|
//
|
|
// end:
|
|
// CHECK: ret ptr @val
|
|
return cond ? val : ((throw "foo"));
|
|
}
|