Clang Project

clang_source_code/test/CodeGenCXX/dllexport-no-dllexport-inlines.cpp
1// RUN: %clang_cc1 %s -fms-extensions -triple x86_64-windows-msvc       \
2// RUN:     -disable-llvm-passes -std=c++14                             \
3// RUN:     -fno-dllexport-inlines -emit-llvm -O1 -o - |                \
4// RUN:     FileCheck --check-prefix=CHECK --check-prefix=NOEXPORTINLINE %s
5
6// RUN: %clang_cc1 %s -fms-extensions -triple x86_64-windows-msvc       \
7// RUN:     -disable-llvm-passes -std=c++14                             \
8// RUN:     -emit-llvm -O1 -o - |                                       \
9// RUN:     FileCheck --check-prefix=CHECK  --check-prefix=EXPORTINLINE %s
10
11
12struct __declspec(dllexport) ExportedClass {
13
14  // NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InclassDefFunc@ExportedClass@@
15  // EXPORTINLINE-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@ExportedClass@@
16  void InclassDefFunc() {}
17
18  // CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticVariable@ExportedClass@@QEAAHXZ"
19  int InclassDefFuncWithStaticVariable() {
20    // CHECK-DAG: @"?static_variable@?1??InclassDefFuncWithStaticVariable@ExportedClass@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
21    static int static_variable = 0;
22    ++static_variable;
23    return static_variable;
24  }
25
26  // CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFunctWithLambdaStaticVariable@ExportedClass@@QEAAHXZ"
27  int InclassDefFunctWithLambdaStaticVariable() {
28    // CHECK-DAG: @"?static_x@?2???R<lambda_1>@?0??InclassDefFunctWithLambdaStaticVariable@ExportedClass@@QEAAHXZ@QEBA?A?<auto>@@XZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
29    return ([]() { static int static_x; return ++static_x; })();
30  }
31
32  // NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InlineOutclassDefFunc@ExportedClass@@QEAAXXZ
33  // EXPORTINLINE-DAG: define weak_odr dso_local dllexport void @"?InlineOutclassDefFunc@ExportedClass@@QEAAXXZ
34  inline void InlineOutclassDefFunc();
35
36  // CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InlineOutclassDefFuncWithStaticVariable@ExportedClass@@QEAAHXZ"
37  inline int InlineOutclassDefFuncWithStaticVariable();
38
39  // CHECK-DAG: define dso_local dllexport void @"?OutoflineDefFunc@ExportedClass@@QEAAXXZ"
40  void OutoflineDefFunc();
41};
42
43void ExportedClass::OutoflineDefFunc() {}
44
45inline void ExportedClass::InlineOutclassDefFunc() {}
46
47inline int ExportedClass::InlineOutclassDefFuncWithStaticVariable() {
48  static int static_variable = 0;
49  return ++static_variable;
50}
51
52void ExportedClassUser() {
53  ExportedClass a;
54  a.InclassDefFunc();
55  a.InlineOutclassDefFunc();
56}
57
58template<typename T>
59struct __declspec(dllexport) TemplateExportedClass {
60  void InclassDefFunc() {}
61
62  int InclassDefFuncWithStaticVariable() {
63    static int static_x = 0;
64    return ++static_x;
65  }
66};
67
68class A11{};
69class B22{};
70
71// CHECK-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@?$TemplateExportedClass@VA11@@@@QEAAXXZ"
72// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VA11@@@@QEAAHXZ"
73// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VA11@@@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
74template class TemplateExportedClass<A11>;
75
76// NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InclassDefFunc@?$TemplateExportedClass@VB22@@@@QEAAXXZ"
77// EXPORTINLINE-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@?$TemplateExportedClass@VB22@@@@QEAAXXZ
78// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VB22@@@@QEAAHXZ"
79// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VB22@@@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
80TemplateExportedClass<B22> b22;
81
82void TemplateExportedClassUser() {
83  b22.InclassDefFunc();
84  b22.InclassDefFuncWithStaticVariable();
85}
86
87
88template<typename T>
89struct TemplateNoAttributeClass {
90  void InclassDefFunc() {}
91  int InclassDefFuncWithStaticLocal() {
92    static int static_x;
93    return ++static_x;
94  }
95};
96
97// CHECK-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@?$TemplateNoAttributeClass@VA11@@@@QEAAXXZ"
98// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VA11
99// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VA11@@@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
100template class __declspec(dllexport) TemplateNoAttributeClass<A11>;
101
102// CHECK-DAG: define available_externally dllimport void @"?InclassDefFunc@?$TemplateNoAttributeClass@VB22@@@@QEAAXXZ"
103// CHECK-DAG: define available_externally dllimport i32 @"?InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VB22@@@@QEAAHXZ"
104// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VB22@@@@QEAAHXZ@4HA" = available_externally dllimport global i32 0, align 4
105extern template class __declspec(dllimport) TemplateNoAttributeClass<B22>;
106
107void TemplateNoAttributeClassUser() {
108  TemplateNoAttributeClass<B22> b22;
109  b22.InclassDefFunc();
110  b22.InclassDefFuncWithStaticLocal();
111}
112
113struct __declspec(dllimport) ImportedClass {
114  // NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InClassDefFunc@ImportedClass@@QEAAXXZ"
115  // EXPORTINLINE-DAG: define available_externally dllimport void @"?InClassDefFunc@ImportedClass@@QEAAXXZ"
116  void InClassDefFunc() {}
117
118  // EXPORTINLINE-DAG: define available_externally dllimport i32 @"?InClassDefFuncWithStaticVariable@ImportedClass@@QEAAHXZ"
119  // NOEXPORTINLINE-DAG: define linkonce_odr dso_local i32 @"?InClassDefFuncWithStaticVariable@ImportedClass@@QEAAHXZ"
120  int InClassDefFuncWithStaticVariable() {
121    // CHECK-DAG: @"?static_variable@?1??InClassDefFuncWithStaticVariable@ImportedClass@@QEAAHXZ@4HA" = available_externally dllimport global i32 0, align 4
122    static int static_variable = 0;
123    ++static_variable;
124    return static_variable;
125  }
126};
127
128int InClassDefFuncUser() {
129  // This is necessary for declare statement of ImportedClass::InClassDefFunc().
130  ImportedClass c;
131  c.InClassDefFunc();
132  return c.InClassDefFuncWithStaticVariable();
133}
134