1 // RUN: %clang_cc1 %s -triple=i686-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s
2 // RUN: %clang_cc1 %s -triple=x86_64-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s
3 // RUN: %clang_cc1 %s -triple=i686-pc-windows-msvc -fms-extensions -emit-llvm -o - | FileCheck %s
4 // RUN: %clang_cc1 %s -triple=x86_64-pc-windows-msvc  -fms-extensions -emit-llvm -o - | FileCheck %s
5 
6 struct S {
7   S();
8   ~S();
9 };
10 
11 template <typename T> struct __declspec(dllexport) ExportedTemplate {
12   static S s;
13 };
14 template <typename T> S ExportedTemplate<T>::s;
useExportedTemplate(ExportedTemplate<int> x)15 void useExportedTemplate(ExportedTemplate<int> x) {
16   (void)x.s;
17 }
18 int f();
19 namespace selectany_init {
20 // MS don't put selectany static var in the linker directive, init routine
21 // f() is not getting called if x is not referenced.
22 int __declspec(selectany) x = f();
23 inline int __declspec(selectany) x1 = f();
24 }
25 
26 namespace explicit_template_instantiation {
27 template <typename T> struct A { static  int x; };
28 template <typename T> int A<T>::x = f();
29 template struct A<int>;
30 }
31 
32 namespace implicit_template_instantiation {
33 template <typename T> struct A { static  int x; };
34 template <typename T>  int A<T>::x = f();
g()35 int g() { return A<int>::x; }
36 }
37 
38 
39 template <class T>
40 struct X_ {
41   static T ioo;
42   static T init();
43 };
44 template <class T> T X_<T>::ioo = X_<T>::init();
45 template struct X_<int>;
46 
47 template <class T>
48 struct X {
49   static T ioo;
50   static T init();
51 };
52 // template specialized static data don't need in llvm.used,
53 // the static init routine get call from _GLOBAL__sub_I_ routines.
54 template <> int X<int>::ioo = X<int>::init();
55 template struct X<int>;
56 class a {
57 public:
58   a();
59 };
60 // For the static var inside unnamed namespace, the object is local to TU.
61 // No need to put static var in the linker directive.
62 // The static init routine is called before main.
63 namespace {
64 template <int> class aj {
65 public:
66   static a al;
67 };
68 template <int am> a aj<am>::al;
69 class b : aj<3> {
70   void c();
71 };
c()72 void b::c() { al; }
73 }
74 
75 // C++17, inline static data member also need to use
76 struct A
77 {
78   A();
79   ~A();
80 };
81 
82 struct S1
83 {
84   inline static A aoo; // C++17 inline variable, thus also a definition
85 };
86 
87 int foo();
88 inline int zoo = foo();
89 inline static int boo = foo();
90 
91 // CHECK: @llvm.used = appending global [8 x i8*] [i8* bitcast (i32* @"?x@selectany_init@@3HA" to i8*), i8* bitcast (i32* @"?x1@selectany_init@@3HA" to i8*), i8* bitcast (i32* @"?x@?$A@H@explicit_template_instantiation@@2HA" to i8*), i8* bitcast (i32* @"?ioo@?$X_@H@@2HA" to i8*), i8* getelementptr inbounds (%struct.A, %struct.A* @"?aoo@S1@@2UA@@A", i32 0, i32 0), i8* bitcast (i32* @"?zoo@@3HA" to i8*), i8* getelementptr inbounds (%struct.S, %struct.S* @"?s@?$ExportedTemplate@H@@2US@@A", i32 0, i32 0), i8* bitcast (i32* @"?x@?$A@H@implicit_template_instantiation@@2HA" to i8*)], section "llvm.metadata"
92