mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-19 11:35:51 -04:00

has a constexpr destructor. For constexpr variables, reject if the variable does not have constant destruction. In all cases, do not emit runtime calls to the destructor for variables with constant destruction. llvm-svn: 373159
78 lines
2.3 KiB
C++
78 lines
2.3 KiB
C++
// RUN: %clang_cc1 %s -emit-llvm -triple x86_64-apple-macosx10.13.0 -o - | FileCheck %s --check-prefixes=CHECK,NO_EXCEPTIONS
|
|
// RUN: %clang_cc1 -fexceptions %s -emit-llvm -triple x86_64-apple-macosx10.13.0 -o - | FileCheck %s --check-prefixes=CHECK,EXCEPTIONS
|
|
|
|
struct NonTrivial {
|
|
~NonTrivial();
|
|
};
|
|
|
|
// CHECK-NOT: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
|
|
[[clang::no_destroy]] NonTrivial nt1;
|
|
// CHECK-NOT: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
|
|
[[clang::no_destroy]] thread_local NonTrivial nt2;
|
|
|
|
struct NonTrivial2 {
|
|
~NonTrivial2();
|
|
};
|
|
|
|
// CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev{{.*}}nt21
|
|
NonTrivial2 nt21;
|
|
// CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev{{.*}}nt22
|
|
thread_local NonTrivial2 nt22;
|
|
|
|
// CHECK-LABEL: define void @_Z1fv
|
|
void f() {
|
|
// CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev
|
|
static NonTrivial2 nt21;
|
|
// CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev
|
|
thread_local NonTrivial2 nt22;
|
|
}
|
|
|
|
// CHECK-LABEL: define void @_Z1gv
|
|
void g() {
|
|
// CHECK-NOT: __cxa_atexit
|
|
[[clang::no_destroy]] static NonTrivial2 nt21;
|
|
// CHECK-NOT: _tlv_atexit
|
|
[[clang::no_destroy]] thread_local NonTrivial2 nt22;
|
|
}
|
|
|
|
// CHECK-LABEL: define internal void @__cxx_global_var_init
|
|
// CHECK: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
|
|
[[clang::always_destroy]] NonTrivial nt3;
|
|
// CHECK-LABEL: define internal void @__cxx_global_var_init
|
|
// CHECK: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
|
|
[[clang::always_destroy]] thread_local NonTrivial nt4;
|
|
|
|
|
|
struct NonTrivial3 {
|
|
NonTrivial3();
|
|
~NonTrivial3();
|
|
};
|
|
|
|
[[clang::no_destroy]] NonTrivial3 arr[10];
|
|
|
|
// CHECK-LABEL: define internal void @__cxx_global_var_init
|
|
// CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev
|
|
// EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev
|
|
// NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev
|
|
// CHECK-NOT: call i32 @__cxa_atexit
|
|
|
|
void h() {
|
|
[[clang::no_destroy]] static NonTrivial3 slarr[10];
|
|
}
|
|
|
|
// CHECK-LABEL: define void @_Z1hv
|
|
// CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev
|
|
// EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev
|
|
// NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev
|
|
// CHECK-NOT: call i32 @__cxa_atexit
|
|
|
|
void i() {
|
|
[[clang::no_destroy]] thread_local NonTrivial3 tlarr[10];
|
|
}
|
|
|
|
// CHECK-LABEL: define void @_Z1iv
|
|
// CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev
|
|
// EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev
|
|
// NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev
|
|
// CHECK-NOT: _tlv_atexit
|