blob: 3400b6080b53f13b51f990918475874b3cf48e33 [file] [log] [blame]
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00001// 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
Erik Pilkington5a559e62018-08-21 17:24:06 +00003
4struct NonTrivial {
5 ~NonTrivial();
6};
7
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +00008// CHECK-LABEL: define internal void @__cxx_global_var_init
Erik Pilkington5a559e62018-08-21 17:24:06 +00009// CHECK-NOT: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
10[[clang::no_destroy]] NonTrivial nt1;
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +000011// CHECK-LABEL: define internal void @__cxx_global_var_init
Erik Pilkington5a559e62018-08-21 17:24:06 +000012// CHECK-NOT: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
13[[clang::no_destroy]] thread_local NonTrivial nt2;
14
15struct NonTrivial2 {
16 ~NonTrivial2();
17};
18
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +000019// CHECK-LABEL: define internal void @__cxx_global_var_init
Erik Pilkington5a559e62018-08-21 17:24:06 +000020// CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev
21NonTrivial2 nt21;
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +000022// CHECK-LABEL: define internal void @__cxx_global_var_init
Erik Pilkington5a559e62018-08-21 17:24:06 +000023// CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev
24thread_local NonTrivial2 nt22;
25
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +000026// CHECK-LABEL: define void @_Z1fv
Erik Pilkington5a559e62018-08-21 17:24:06 +000027void f() {
28 // CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev
29 static NonTrivial2 nt21;
30 // CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev
31 thread_local NonTrivial2 nt22;
32}
33
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +000034// CHECK-LABEL: define void @_Z1gv
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
Erik Pilkington5a559e62018-08-21 17:24:06 +000043// CHECK: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
44[[clang::always_destroy]] NonTrivial nt3;
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +000045// CHECK-LABEL: define internal void @__cxx_global_var_init
Erik Pilkington5a559e62018-08-21 17:24:06 +000046// CHECK: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
47[[clang::always_destroy]] thread_local NonTrivial nt4;
Erik Pilkingtonf8ccf052019-05-10 17:52:26 +000048
49
50struct 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
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
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