Index: llvm/tools/clang/test/CodeGenCXX/dllexport.cpp =================================================================== --- llvm/tools/clang/test/CodeGenCXX/dllexport.cpp +++ llvm/tools/clang/test/CodeGenCXX/dllexport.cpp @@ -570,6 +570,30 @@ USEVAR(T::b) int T::c; +// Export template class with static member variable +// MSC-DAG: @"\01?StaticClassVarExpTmplClass@?$TmplClass@H@@2HA" = weak_odr dllexport global i32 0, comdat, align 4 +// GNU-DAG: @_ZN9TmplClassIiE26StaticClassVarExpTmplClassE = weak_odr dllexport global i32 0, comdat, align 4 +template +struct __declspec(dllexport) TmplClass +{ + static T StaticClassVarExpTmplClass; +}; + +template +T TmplClass::StaticClassVarExpTmplClass; + +// Export a definition of a template function. +// MSC-DAG: define weak_odr dllexport i32 @"\01??$TypeFunTmpl@H@@YAHH@Z" +// GNU-DAG: define weak_odr dllexport i32 @_Z11TypeFunTmplIiET_S0_ +template +T __declspec(dllexport) TypeFunTmpl(T t) { return t + t; } + +// Instantiate the exported template class and the exported template function. +int useExportedTmplStaticAndFun() +{ + return TmplClass::StaticClassVarExpTmplClass + TypeFunTmpl(10); +} + template struct __declspec(dllexport) U { void foo() {} }; struct __declspec(dllexport) V : public U { }; // U's assignment operator is emitted. Index: llvm/tools/clang/test/CodeGenCXX/dllimport.cpp =================================================================== --- llvm/tools/clang/test/CodeGenCXX/dllimport.cpp +++ llvm/tools/clang/test/CodeGenCXX/dllimport.cpp @@ -27,6 +27,7 @@ #define USEVAR(var) USEVARTYPE(int, var) #define USE(func) void UNIQ(use)() { func(); } #define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; } +#define USESTATICMEMFUNC(class, func) void (*UNIQ(use)())() { return &class::func; } #define USECLASS(class) void UNIQ(USE)() { class x; } #define USECOPYASSIGN(class) class& (class::*UNIQ(use)())(class&) { return &class::operator=; } #define USEMOVEASSIGN(class) class& (class::*UNIQ(use)())(class&&) { return &class::operator=; } @@ -590,6 +591,10 @@ void a() {} // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?a@T@@QAEXXZ" + static void StaticMethod(); + // MSC-DAG: declare dllimport void @"\01?StaticMethod@T@@SAXXZ"() + // GNU-DAG: declare dllimport void @_ZN1T12StaticMethodEv() + static int b; // MO1-DAG: @"\01?b@T@@2HA" = external dllimport global i32 @@ -602,6 +607,7 @@ // M19-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.T* @"\01??4T@@QAEAAU0@$$QAU0@@Z" }; USEMEMFUNC(T, a) +USESTATICMEMFUNC(T, StaticMethod) USEVAR(T::b) USECOPYASSIGN(T) USEMOVEASSIGN(T)