1 // RUN: %clang_cc1 %s -fno-c++-static-destructors -emit-llvm -triple x86_64-apple-macosx10.13.0 -o - | FileCheck %s
2 
3 struct NonTrivial {
4   ~NonTrivial();
5 };
6 
7 // CHECK-NOT: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
8 NonTrivial nt1;
9 // CHECK-NOT: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
10 thread_local NonTrivial nt2;
11 
12 struct NonTrivial2 {
13   ~NonTrivial2();
14 };
15 
16 // CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev
17 [[clang::always_destroy]] NonTrivial2 nt21;
18 // CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev
19 [[clang::always_destroy]] thread_local NonTrivial2 nt22;
20 
f()21 void f() {
22   // CHECK: __cxa_atexit{{.*}}_ZN11NonTrivial2D1Ev
23   [[clang::always_destroy]] static NonTrivial2 nt21;
24   // CHECK: _tlv_atexit{{.*}}_ZN11NonTrivial2D1Ev
25   [[clang::always_destroy]] thread_local NonTrivial2 nt22;
26 }
27 
28 // CHECK-NOT: __cxa_atexit{{.*}}_ZN10NonTrivialD1Ev
29 [[clang::no_destroy]] NonTrivial nt3;
30 // CHECK-NOT: _tlv_atexit{{.*}}_ZN10NonTrivialD1Ev
31 [[clang::no_destroy]] thread_local NonTrivial nt4;
32