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()27 void 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()35 void 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()63 void 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()73 void 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