134 lines
6.1 KiB
C++
134 lines
6.1 KiB
C++
|
// RUN: %clang_cc1 %s -fms-extensions -triple x86_64-windows-msvc \
|
||
|
// RUN: -disable-llvm-passes -std=c++14 \
|
||
|
// RUN: -fno-dllexport-inlines -emit-llvm -O1 -o - | \
|
||
|
// RUN: FileCheck --check-prefix=CHECK --check-prefix=NOEXPORTINLINE %s
|
||
|
|
||
|
// RUN: %clang_cc1 %s -fms-extensions -triple x86_64-windows-msvc \
|
||
|
// RUN: -disable-llvm-passes -std=c++14 \
|
||
|
// RUN: -emit-llvm -O1 -o - | \
|
||
|
// RUN: FileCheck --check-prefix=CHECK --check-prefix=EXPORTINLINE %s
|
||
|
|
||
|
|
||
|
struct __declspec(dllexport) ExportedClass {
|
||
|
|
||
|
// NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InclassDefFunc@ExportedClass@@
|
||
|
// EXPORTINLINE-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@ExportedClass@@
|
||
|
void InclassDefFunc() {}
|
||
|
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticVariable@ExportedClass@@QEAAHXZ"
|
||
|
int InclassDefFuncWithStaticVariable() {
|
||
|
// CHECK-DAG: @"?static_variable@?1??InclassDefFuncWithStaticVariable@ExportedClass@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
|
||
|
static int static_variable = 0;
|
||
|
++static_variable;
|
||
|
return static_variable;
|
||
|
}
|
||
|
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFunctWithLambdaStaticVariable@ExportedClass@@QEAAHXZ"
|
||
|
int InclassDefFunctWithLambdaStaticVariable() {
|
||
|
// 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
|
||
|
return ([]() { static int static_x; return ++static_x; })();
|
||
|
}
|
||
|
|
||
|
// NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InlineOutclassDefFunc@ExportedClass@@QEAAXXZ
|
||
|
// EXPORTINLINE-DAG: define weak_odr dso_local dllexport void @"?InlineOutclassDefFunc@ExportedClass@@QEAAXXZ
|
||
|
inline void InlineOutclassDefFunc();
|
||
|
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InlineOutclassDefFuncWithStaticVariable@ExportedClass@@QEAAHXZ"
|
||
|
inline int InlineOutclassDefFuncWithStaticVariable();
|
||
|
|
||
|
// CHECK-DAG: define dso_local dllexport void @"?OutoflineDefFunc@ExportedClass@@QEAAXXZ"
|
||
|
void OutoflineDefFunc();
|
||
|
};
|
||
|
|
||
|
void ExportedClass::OutoflineDefFunc() {}
|
||
|
|
||
|
inline void ExportedClass::InlineOutclassDefFunc() {}
|
||
|
|
||
|
inline int ExportedClass::InlineOutclassDefFuncWithStaticVariable() {
|
||
|
static int static_variable = 0;
|
||
|
return ++static_variable;
|
||
|
}
|
||
|
|
||
|
void ExportedClassUser() {
|
||
|
ExportedClass a;
|
||
|
a.InclassDefFunc();
|
||
|
a.InlineOutclassDefFunc();
|
||
|
}
|
||
|
|
||
|
template<typename T>
|
||
|
struct __declspec(dllexport) TemplateExportedClass {
|
||
|
void InclassDefFunc() {}
|
||
|
|
||
|
int InclassDefFuncWithStaticVariable() {
|
||
|
static int static_x = 0;
|
||
|
return ++static_x;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
class A11{};
|
||
|
class B22{};
|
||
|
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@?$TemplateExportedClass@VA11@@@@QEAAXXZ"
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VA11@@@@QEAAHXZ"
|
||
|
// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VA11@@@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
|
||
|
template class TemplateExportedClass<A11>;
|
||
|
|
||
|
// NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InclassDefFunc@?$TemplateExportedClass@VB22@@@@QEAAXXZ"
|
||
|
// EXPORTINLINE-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@?$TemplateExportedClass@VB22@@@@QEAAXXZ
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VB22@@@@QEAAHXZ"
|
||
|
// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticVariable@?$TemplateExportedClass@VB22@@@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
|
||
|
TemplateExportedClass<B22> b22;
|
||
|
|
||
|
void TemplateExportedClassUser() {
|
||
|
b22.InclassDefFunc();
|
||
|
b22.InclassDefFuncWithStaticVariable();
|
||
|
}
|
||
|
|
||
|
|
||
|
template<typename T>
|
||
|
struct TemplateNoAttributeClass {
|
||
|
void InclassDefFunc() {}
|
||
|
int InclassDefFuncWithStaticLocal() {
|
||
|
static int static_x;
|
||
|
return ++static_x;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport void @"?InclassDefFunc@?$TemplateNoAttributeClass@VA11@@@@QEAAXXZ"
|
||
|
// CHECK-DAG: define weak_odr dso_local dllexport i32 @"?InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VA11
|
||
|
// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VA11@@@@QEAAHXZ@4HA" = weak_odr dso_local dllexport global i32 0, comdat, align 4
|
||
|
template class __declspec(dllexport) TemplateNoAttributeClass<A11>;
|
||
|
|
||
|
// CHECK-DAG: define available_externally dllimport void @"?InclassDefFunc@?$TemplateNoAttributeClass@VB22@@@@QEAAXXZ"
|
||
|
// CHECK-DAG: define available_externally dllimport i32 @"?InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VB22@@@@QEAAHXZ"
|
||
|
// CHECK-DAG: @"?static_x@?2??InclassDefFuncWithStaticLocal@?$TemplateNoAttributeClass@VB22@@@@QEAAHXZ@4HA" = available_externally dllimport global i32 0, align 4
|
||
|
extern template class __declspec(dllimport) TemplateNoAttributeClass<B22>;
|
||
|
|
||
|
void TemplateNoAttributeClassUser() {
|
||
|
TemplateNoAttributeClass<B22> b22;
|
||
|
b22.InclassDefFunc();
|
||
|
b22.InclassDefFuncWithStaticLocal();
|
||
|
}
|
||
|
|
||
|
struct __declspec(dllimport) ImportedClass {
|
||
|
// NOEXPORTINLINE-DAG: define linkonce_odr dso_local void @"?InClassDefFunc@ImportedClass@@QEAAXXZ"
|
||
|
// EXPORTINLINE-DAG: define available_externally dllimport void @"?InClassDefFunc@ImportedClass@@QEAAXXZ"
|
||
|
void InClassDefFunc() {}
|
||
|
|
||
|
// EXPORTINLINE-DAG: define available_externally dllimport i32 @"?InClassDefFuncWithStaticVariable@ImportedClass@@QEAAHXZ"
|
||
|
// NOEXPORTINLINE-DAG: define linkonce_odr dso_local i32 @"?InClassDefFuncWithStaticVariable@ImportedClass@@QEAAHXZ"
|
||
|
int InClassDefFuncWithStaticVariable() {
|
||
|
// CHECK-DAG: @"?static_variable@?1??InClassDefFuncWithStaticVariable@ImportedClass@@QEAAHXZ@4HA" = available_externally dllimport global i32 0, align 4
|
||
|
static int static_variable = 0;
|
||
|
++static_variable;
|
||
|
return static_variable;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
int InClassDefFuncUser() {
|
||
|
// This is necessary for declare statement of ImportedClass::InClassDefFunc().
|
||
|
ImportedClass c;
|
||
|
c.InClassDefFunc();
|
||
|
return c.InClassDefFuncWithStaticVariable();
|
||
|
}
|