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
11 template <typename T
> struct __declspec(dllexport
) ExportedTemplate
{
14 template <typename T
> S ExportedTemplate
<T
>::s
;
15 void useExportedTemplate(ExportedTemplate
<int> x
) {
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();
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>;
32 namespace implicit_template_instantiation
{
33 template <typename T
> struct A
{ static int x
; };
34 template <typename T
> int A
<T
>::x
= f();
35 int g() { return A
<int>::x
; }
44 template <class T
> T X_
<T
>::ioo
= X_
<T
>::init();
45 template struct X_
<int>;
52 template <> int X
<int>::ioo
= X
<int>::init();
53 template struct X
<int>;
58 // For the static var inside unnamed namespace, the object is local to TU.
59 // No need to put static var in the linker directive.
60 // The static init routine is called before main.
62 template <int> class aj
{
66 template <int am
> a aj
<am
>::al
;
73 // C++17, inline static data member also need to use
82 inline static A aoo
; // C++17 inline variable, thus also a definition
86 inline int zoo
= foo();
87 inline static int boo
= foo();
88 inline __declspec(dllexport
) A exported_inline
{};
90 // CHECK: @llvm.used = appending global [10 x ptr] [ptr @"?x@selectany_init@@3HA", ptr @"?x1@selectany_init@@3HA", ptr @"?x@?$A@H@explicit_template_instantiation@@2HA", ptr @"?ioo@?$X_@H@@2HA", ptr @"?ioo@?$X@H@@2HA", ptr @"?aoo@S1@@2UA@@A", ptr @"?zoo@@3HA", ptr @"?exported_inline@@3UA@@A", ptr @"?s@?$ExportedTemplate@H@@2US@@A", ptr @"?x@?$A@H@implicit_template_instantiation@@2HA"], section "llvm.metadata"