| // 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 |