xref: /llvm-project/clang/test/CodeGenCXX/no_destroy.cpp (revision 6b3351792c6c9a362a3e8b826bc1d96f8e1918e0)
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-NOT: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
9 [[clang::no_destroy]] NonTrivial nt1;
10 // CHECK-NOT: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
11 [[clang::no_destroy]] thread_local NonTrivial nt2;
12 
13 struct NonTrivial2 {
14   ~NonTrivial2();
15 };
16 
17 // CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev{{.*}}nt21
18 NonTrivial2 nt21;
19 // CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev{{.*}}nt22
20 thread_local NonTrivial2 nt22;
21 
22 // CHECK-LABEL: define{{.*}} void @_Z1fv
f()23 void f() {
24   // CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev
25   static NonTrivial2 nt21;
26   // CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev
27   thread_local NonTrivial2 nt22;
28 }
29 
30 // CHECK-LABEL: define{{.*}} void @_Z1gv
g()31 void g() {
32   // CHECK-NOT: __cxa_atexit
33   [[clang::no_destroy]] static NonTrivial2 nt21;
34   // CHECK-NOT: _tlv_atexit
35   [[clang::no_destroy]] thread_local NonTrivial2 nt22;
36 }
37 
38 // CHECK-LABEL: define internal void @__cxx_global_var_init
39 // CHECK: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
40 [[clang::always_destroy]] NonTrivial nt3;
41 // CHECK-LABEL: define internal void @__cxx_global_var_init
42 // CHECK: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
43 [[clang::always_destroy]] thread_local NonTrivial nt4;
44 
45 
46 struct NonTrivial3 {
47   NonTrivial3();
48   ~NonTrivial3();
49 };
50 
51 [[clang::no_destroy]] NonTrivial3 arr[10];
52 
53 // CHECK-LABEL: define internal void @__cxx_global_var_init
54 // CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev
55 // EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev
56 // NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev
57 // CHECK-NOT: call i32 @__cxa_atexit
58 
h()59 void h() {
60   [[clang::no_destroy]] static NonTrivial3 slarr[10];
61 }
62 
63 // CHECK-LABEL: define{{.*}} void @_Z1hv
64 // CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev
65 // EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev
66 // NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev
67 // CHECK-NOT: call i32 @__cxa_atexit
68 
i()69 void i() {
70   [[clang::no_destroy]] thread_local NonTrivial3 tlarr[10];
71 }
72 
73 // CHECK-LABEL: define{{.*}} void @_Z1iv
74 // CHECK: {{invoke|call}} void @_ZN11NonTrivial3C1Ev
75 // EXCEPTIONS: call void @_ZN11NonTrivial3D1Ev
76 // NO_EXCEPTIONS-NOT: call void @_ZN11NonTrivial3D1Ev
77 // CHECK-NOT: _tlv_atexit
78