1 // RUN: %clang_cc1 %s -emit-llvm -triple x86_64-apple-macosx10.13.0 -o - | FileCheck %s --check-prefixes=CHECK,NO_EXCEPTIONS 2 // RUN: %clang_cc1 -fexceptions %s -emit-llvm -triple x86_64-apple-macosx10.13.0 -o - | FileCheck %s --check-prefixes=CHECK,EXCEPTIONS 3 4 struct NonTrivial { 5 ~NonTrivial(); 6 }; 7 8 // CHECK-LABEL: define internal void @__cxx_global_var_init 9 // CHECK-NOT: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev 10 [[clang::no_destroy]] NonTrivial nt1; 11 // CHECK-LABEL: define internal void @__cxx_global_var_init 12 // CHECK-NOT: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev 13 [[clang::no_destroy]] thread_local NonTrivial nt2; 14 15 struct NonTrivial2 { 16 ~NonTrivial2(); 17 }; 18 19 // CHECK-LABEL: define internal void @__cxx_global_var_init 20 // CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev 21 NonTrivial2 nt21; 22 // CHECK-LABEL: define internal void @__cxx_global_var_init 23 // CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev 24 thread_local NonTrivial2 nt22; 25 26 // CHECK-LABEL: define void @_Z1fv f()27void f() { 28 // CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev 29 static NonTrivial2 nt21; 30 // CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev 31 thread_local NonTrivial2 nt22; 32 } 33 34 // CHECK-LABEL: define void @_Z1gv g()35void g() { 36 // CHECK-NOT: __cxa_atexit 37 [[clang::no_destroy]] static NonTrivial2 nt21; 38 // CHECK-NOT: _tlv_atexit 39 [[clang::no_destroy]] thread_local NonTrivial2 nt22; 40 } 41 42 // CHECK-LABEL: define internal void @__cxx_global_var_init 43 // CHECK: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev 44 [[clang::always_destroy]] NonTrivial nt3; 45 // CHECK-LABEL: define internal void @__cxx_global_var_init 46 // CHECK: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev 47 [[clang::always_destroy]] thread_local NonTrivial nt4; 48 49 50 struct NonTrivial3 { 51 NonTrivial3(); 52 ~NonTrivial3(); 53 }; 54 55 [[clang::no_destroy]] NonTrivial3 arr[10]; 56 57 // CHECK-LABEL: define internal void @__cxx_global_var_init 58 // CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev 59 // EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev 60 // NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev 61 // CHECK-NOT: call i32 @__cxa_atexit 62 h()63void h() { 64 [[clang::no_destroy]] static NonTrivial3 slarr[10]; 65 } 66 67 // CHECK-LABEL: define void @_Z1hv 68 // CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev 69 // EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev 70 // NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev 71 // CHECK-NOT: call i32 @__cxa_atexit 72 i()73void i() { 74 [[clang::no_destroy]] thread_local NonTrivial3 tlarr[10]; 75 } 76 77 // CHECK-LABEL: define void @_Z1iv 78 // CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev 79 // EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev 80 // NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev 81 // CHECK-NOT: _tlv_atexit 82