blob: 3b419c18c0e230b94482951ad7f4f436d16ed6a8 [file] [log] [blame]
Jennifer Yuc19f4f82019-04-25 17:45:45 +00001// 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
6struct S {
7 S();
8 ~S();
9};
10
11template <typename T> struct __declspec(dllexport) ExportedTemplate {
12 static S s;
13};
14template <typename T> S ExportedTemplate<T>::s;
15void useExportedTemplate(ExportedTemplate<int> x) {
16 (void)x.s;
17}
18int f();
19namespace 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.
22int __declspec(selectany) x = f();
23inline int __declspec(selectany) x1 = f();
24}
25
26namespace explicit_template_instantiation {
27template <typename T> struct A { static int x; };
28template <typename T> int A<T>::x = f();
29template struct A<int>;
30}
31
32namespace implicit_template_instantiation {
33template <typename T> struct A { static int x; };
34template <typename T> int A<T>::x = f();
35int g() { return A<int>::x; }
36}
37
38
39template <class T>
40struct X_ {
41 static T ioo;
42 static T init();
43};
44template <class T> T X_<T>::ioo = X_<T>::init();
45template struct X_<int>;
46
47template <class T>
48struct 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.
54template <> int X<int>::ioo = X<int>::init();
55template struct X<int>;
56class a {
57public:
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.
63namespace {
64template <int> class aj {
65public:
66 static a al;
67};
68template <int am> a aj<am>::al;
69class b : aj<3> {
70 void c();
71};
72void b::c() { al; }
73}
74
75// C++17, inline static data member also need to use
76struct A
77{
78 A();
79 ~A();
80};
81
82struct S1
83{
84 inline static A aoo; // C++17 inline variable, thus also a definition
85};
86
87int foo();
88inline int zoo = foo();
89inline static int boo = foo();
90
91
92// CHECK: @llvm.used = appending global [7 x 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"