1 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-llvm -o - %s -std=c++2a | FileCheck %s --implicit-check-not=cxx_global_var_init --implicit-check-not=cxa_atexit
2 
3 // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-pch -o %t.pch %s -std=c++2a
4 // RUN: %clang_cc1 -triple x86_64-linux-gnu -include-pch %t.pch -x c++ /dev/null -emit-llvm -o - -std=c++2a | FileCheck %s --implicit-check-not=cxx_global_var_init --implicit-check-not=cxa_atexit
5 
6 // CHECK: @a = global i32 123,
7 int a = (delete new int, 123);
8 
9 struct B {
BB10   constexpr B() {}
~BB11   constexpr ~B() { n *= 5; }
12   int n = 123;
13 };
14 // CHECK: @b = global {{.*}} i32 123
15 extern constexpr B b = B();
16 
17 // CHECK: @_ZL1c = internal global {{.*}} i32 123
18 const B c;
use_c()19 int use_c() { return c.n; }
20 
21 struct D {
22   int n;
~DD23   constexpr ~D() {}
24 };
25 D d;
26 // CHECK: @d = global {{.*}} zeroinitializer
27 
28 D d_arr[3];
29 // CHECK: @d_arr = global {{.*}} zeroinitializer
30 
31 thread_local D d_tl;
32 // CHECK: @d_tl = thread_local global {{.*}} zeroinitializer
33 
34 // CHECK-NOT: @llvm.global_ctors
35 
36 // CHECK-LABEL: define {{.*}} @_Z1fv(
f()37 void f() {
38   // CHECK-NOT: call
39   // CHECK: call {{.*}}memcpy
40   // CHECK-NOT: call
41   // CHECK: call {{.*}}memset
42   // CHECK-NOT: call
43   // CHECK: }
44   constexpr B b;
45   D d = D();
46 }
47 
48 // CHECK-LABEL: define {{.*}} @_Z1gv(
g()49 void g() {
50   // CHECK-NOT: call
51   // CHECK-NOT: cxa_guard
52   // CHECK-NOT: _ZGV
53   // CHECK: }
54   static constexpr B b1;
55   static const B b2;
56   static D d;
57   thread_local D d_tl;
58 }
59