10e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple i686-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -DMSABI -w | FileCheck --check-prefix=MSC --check-prefix=M32 %s 20e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple x86_64-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -DMSABI -w | FileCheck --check-prefix=MSC --check-prefix=M64 %s 30e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple i686-windows-gnu -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -w | FileCheck --check-prefix=GNU --check-prefix=G32 %s 40e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple x86_64-windows-gnu -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -w | FileCheck --check-prefix=GNU --check-prefix=G64 %s 50e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple i686-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O1 -o - %s -DMSABI -w | FileCheck --check-prefix=MO1 %s 60e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple i686-windows-gnu -fno-rtti -emit-llvm -std=c++1y -O1 -o - %s -w | FileCheck --check-prefix=GO1 %s 7c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 8c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// CHECK-NOT doesn't play nice with CHECK-DAG, so use separate run lines. 90e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple i686-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -DMSABI -w | FileCheck --check-prefix=MSC2 %s 100e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -triple i686-windows-gnu -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -w | FileCheck --check-prefix=GNU2 %s 116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Helper structs to make templates more expressive. 136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ImplicitInst_Imported {}; 146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ImplicitInst_NotImported {}; 156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ExplicitDecl_Imported {}; 166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ExplicitInst_Imported {}; 176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ExplicitSpec_Imported {}; 186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ExplicitSpec_Def_Imported {}; 196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ExplicitSpec_InlineDef_Imported {}; 206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct ExplicitSpec_NotImported {}; 216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define JOIN2(x, y) x##y 236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define JOIN(x, y) JOIN2(x, y) 246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define UNIQ(name) JOIN(name, __LINE__) 256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define USEVARTYPE(type, var) type UNIQ(use)() { return var; } 266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define USEVAR(var) USEVARTYPE(int, var) 276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#define USE(func) void UNIQ(use)() { func(); } 28c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; } 29c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#define USECLASS(class) void UNIQ(USE)() { class x; } 30c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#define USECOPYASSIGN(class) class& (class::*UNIQ(use)())(class&) { return &class::operator=; } 31c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines#define USEMOVEASSIGN(class) class& (class::*UNIQ(use)())(class&&) { return &class::operator=; } 326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Globals 356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import declaration. 386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01?ExternGlobalDecl@@3HA" = external dllimport global i32 396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @ExternGlobalDecl = external dllimport global i32 406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) extern int ExternGlobalDecl; 416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ExternGlobalDecl) 426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dllimport implies a declaration. 446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01?GlobalDecl@@3HA" = external dllimport global i32 456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @GlobalDecl = external dllimport global i32 466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) int GlobalDecl; 476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(GlobalDecl) 486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Redeclarations 506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01?GlobalRedecl1@@3HA" = external dllimport global i32 516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @GlobalRedecl1 = external dllimport global i32 526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) extern int GlobalRedecl1; 536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) extern int GlobalRedecl1; 546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(GlobalRedecl1) 556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01?GlobalRedecl2a@@3HA" = external dllimport global i32 576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @GlobalRedecl2a = external dllimport global i32 586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) int GlobalRedecl2a; 596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) int GlobalRedecl2a; 606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(GlobalRedecl2a) 616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// M32-DAG: @"\01?GlobalRedecl2b@@3PAHA" = external dllimport global i32* 636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// M64-DAG: @"\01?GlobalRedecl2b@@3PEAHEA" = external dllimport global i32* 646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @GlobalRedecl2b = external dllimport global i32* 656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesint *__attribute__((dllimport)) GlobalRedecl2b; 666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesint *__attribute__((dllimport)) GlobalRedecl2b; 676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVARTYPE(int*, GlobalRedecl2b) 686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01?GlobalRedecl2c@@3HA" = external dllimport global i32 706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @GlobalRedecl2c = external dllimport global i32 716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesint GlobalRedecl2c __attribute__((dllimport)); 726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesint GlobalRedecl2c __attribute__((dllimport)); 736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(GlobalRedecl2c) 746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// NB: MSC issues a warning and makes GlobalRedecl3 dllexport. We follow GCC 766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// and drop the dllimport with a warning. 776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01?GlobalRedecl3@@3HA" = external global i32 786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @GlobalRedecl3 = external global i32 796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) extern int GlobalRedecl3; 806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines extern int GlobalRedecl3; // dllimport ignored 816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(GlobalRedecl3) 826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01?ExternalGlobal@ns@@3HA" = external dllimport global i32 846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_ZN2ns14ExternalGlobalE = external dllimport global i32 856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ns { __declspec(dllimport) int ExternalGlobal; } 866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ns::ExternalGlobal) 876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 88c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint f(); 89c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MO1-DAG: @"\01?x@?1??inlineStaticLocalsFunc@@YAHXZ@4HA" = available_externally dllimport global i32 0 90c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MO1-DAG: @"\01??_B?1??inlineStaticLocalsFunc@@YAHXZ@51" = available_externally dllimport global i32 0 91c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesinline int __declspec(dllimport) inlineStaticLocalsFunc() { 92c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static int x = f(); 93c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return x++; 94c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 95c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSE(inlineStaticLocalsFunc); 96c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 97c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// The address of a dllimport global cannot be used in constant initialization. 98176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: @"\01?arr@?1??initializationFunc@@YAPAHXZ@4QBQAHB" = internal global [1 x i32*] zeroinitializer 99c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// GNU-DAG: @_ZZ18initializationFuncvE3arr = internal global [1 x i32*] zeroinitializer 100c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesint *initializationFunc() { 101c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static int *const arr[] = {&ExternGlobalDecl}; 102c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines return arr[0]; 103c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 104c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSE(initializationFunc); 1056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Variable templates 1096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 1106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import declaration. 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$ExternVarTmplDecl@UImplicitInst_Imported@@@@3HA" = external dllimport global i32 1136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z17ExternVarTmplDeclI21ImplicitInst_ImportedE = external dllimport global i32 1146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) extern int ExternVarTmplDecl; 1156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ExternVarTmplDecl<ImplicitInst_Imported>) 1166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// dllimport implies a declaration. 1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$VarTmplDecl@UImplicitInst_Imported@@@@3HA" = external dllimport global i32 1196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z11VarTmplDeclI21ImplicitInst_ImportedE = external dllimport global i32 1206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) int VarTmplDecl; 1216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(VarTmplDecl<ImplicitInst_Imported>) 1226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Redeclarations 1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$VarTmplRedecl1@UImplicitInst_Imported@@@@3HA" = external dllimport global i32 1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z14VarTmplRedecl1I21ImplicitInst_ImportedE = external dllimport global i32 1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) extern int VarTmplRedecl1; 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) extern int VarTmplRedecl1; 1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(VarTmplRedecl1<ImplicitInst_Imported>) 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$VarTmplRedecl2@UImplicitInst_Imported@@@@3HA" = external dllimport global i32 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z14VarTmplRedecl2I21ImplicitInst_ImportedE = external dllimport global i32 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) int VarTmplRedecl2; 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) int VarTmplRedecl2; 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(VarTmplRedecl2<ImplicitInst_Imported>) 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$VarTmplRedecl3@UImplicitInst_Imported@@@@3HA" = external global i32 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z14VarTmplRedecl3I21ImplicitInst_ImportedE = external global i32 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) extern int VarTmplRedecl3; 1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> extern int VarTmplRedecl3; // dllimport ignored 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(VarTmplRedecl3<ImplicitInst_Imported>) 1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$ExternalVarTmpl@UImplicitInst_Imported@@@ns@@3HA" = external dllimport global i32 1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_ZN2ns15ExternalVarTmplI21ImplicitInst_ImportedEE = external dllimport global i32 1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ns { template<typename T> __declspec(dllimport) int ExternalVarTmpl; } 1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ns::ExternalVarTmpl<ImplicitInst_Imported>) 1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> int VarTmpl; 1506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) int ImportedVarTmpl; 1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import implicit instantiation of an imported variable template. 1536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$ImportedVarTmpl@UImplicitInst_Imported@@@@3HA" = external dllimport global i32 1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z15ImportedVarTmplI21ImplicitInst_ImportedE = external dllimport global i32 1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ImportedVarTmpl<ImplicitInst_Imported>) 1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation declaration of an imported variable template. 1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$ImportedVarTmpl@UExplicitDecl_Imported@@@@3HA" = external dllimport global i32 1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z15ImportedVarTmplI21ExplicitDecl_ImportedE = external dllimport global i32 1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template int ImportedVarTmpl<ExplicitDecl_Imported>; 1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ImportedVarTmpl<ExplicitDecl_Imported>) 1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// An explicit instantiation definition of an imported variable template cannot 1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// be imported because the template must be defined which is illegal. 1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import specialization of an imported variable template. 1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$ImportedVarTmpl@UExplicitSpec_Imported@@@@3HA" = external dllimport global i32 1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z15ImportedVarTmplI21ExplicitSpec_ImportedE = external dllimport global i32 1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) int ImportedVarTmpl<ExplicitSpec_Imported>; 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ImportedVarTmpl<ExplicitSpec_Imported>) 1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Not importing specialization of an imported variable template without 1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// explicit dllimport. 1746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$ImportedVarTmpl@UExplicitSpec_NotImported@@@@3HA" = global i32 0, align 4 1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z15ImportedVarTmplI24ExplicitSpec_NotImportedE = global i32 0, align 4 1766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> int ImportedVarTmpl<ExplicitSpec_NotImported>; 1776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(ImportedVarTmpl<ExplicitSpec_NotImported>) 1786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation declaration of a non-imported variable template. 1806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$VarTmpl@UExplicitDecl_Imported@@@@3HA" = external dllimport global i32 1816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z7VarTmplI21ExplicitDecl_ImportedE = external dllimport global i32 1826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template __declspec(dllimport) int VarTmpl<ExplicitDecl_Imported>; 1836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(VarTmpl<ExplicitDecl_Imported>) 1846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation definition of a non-imported variable template. 1866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$VarTmpl@UExplicitInst_Imported@@@@3HA" = external dllimport global i32 1876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z7VarTmplI21ExplicitInst_ImportedE = external dllimport global i32 1886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate __declspec(dllimport) int VarTmpl<ExplicitInst_Imported>; 1896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(VarTmpl<ExplicitInst_Imported>) 1906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import specialization of a non-imported variable template. 1926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: @"\01??$VarTmpl@UExplicitSpec_Imported@@@@3HA" = external dllimport global i32 1936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: @_Z7VarTmplI21ExplicitSpec_ImportedE = external dllimport global i32 1946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) int VarTmpl<ExplicitSpec_Imported>; 1956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSEVAR(VarTmpl<ExplicitSpec_Imported>) 1966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 2006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Functions 2016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 2026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import function declaration. 2046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?decl@@YAXXZ"() 2056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z4declv() 2066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void decl(); 2076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(decl) 2086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// extern "C" 2106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @externC() 2116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @externC() 2126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern "C" __declspec(dllimport) void externC(); 2136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(externC) 2146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import inline function. 2166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?inlineFunc@@YAXXZ"() 217176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z10inlineFuncv() 2186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01?inlineFunc@@YAXXZ"() 219176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z10inlineFuncv() 2206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) inline void inlineFunc() {} 2216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFunc) 2226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?inlineDecl@@YAXXZ"() 224176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z10inlineDeclv() 2256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01?inlineDecl@@YAXXZ"() 226176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z10inlineDeclv() 2276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) inline void inlineDecl(); 2286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void inlineDecl() {} 2296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineDecl) 2306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?inlineDef@@YAXXZ"() 232176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z9inlineDefv() 2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01?inlineDef@@YAXXZ"() 234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z9inlineDefv() 2356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void inlineDef(); 2366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines inline void inlineDef() {} 2376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineDef) 2386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// inline attributes 2406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?noinline@@YAXXZ"() 241176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z8noinlinev() 2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) __attribute__((noinline)) inline void noinline() {} 2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(noinline) 2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 245c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MSC2-NOT: @"\01?alwaysInline@@YAXXZ"() 2460e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// GNU-DAG: define linkonce_odr void @_Z12alwaysInlinev() {{.*}} comdat { 2476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) __attribute__((always_inline)) inline void alwaysInline() {} 2486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(alwaysInline) 2496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Redeclarations 2516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?redecl1@@YAXXZ"() 2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z7redecl1v() 2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void redecl1(); 2546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void redecl1(); 2556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(redecl1) 2566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// NB: MSC issues a warning and makes redecl2/redecl3 dllexport. We follow GCC 2586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// and drop the dllimport with a warning. 2596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare void @"\01?redecl2@@YAXXZ"() 2606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare void @_Z7redecl2v() 2616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void redecl2(); 2626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void redecl2(); 2636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(redecl2) 2646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define void @"\01?redecl3@@YAXXZ"() 2666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define void @_Z7redecl3v() 2676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void redecl3(); 2686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void redecl3() {} // dllimport ignored 2696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(redecl3) 2706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Friend functions 2736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?friend1@@YAXXZ"() 2746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z7friend1v() 2756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare void @"\01?friend2@@YAXXZ"() 2766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare void @_Z7friend2v() 2776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define void @"\01?friend3@@YAXXZ"() 2786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define void @_Z7friend3v() 279176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// MSC-DAG: declare void @"\01?friend4@@YAXXZ"() 280176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: declare void @_Z7friend4v() 281176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// MSC-DAG: declare dllimport void @"\01?friend5@@YAXXZ"() 282176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: declare dllimport void @_Z7friend5v() 283176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct FuncFriend { 2856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend __declspec(dllimport) void friend1(); 2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend __declspec(dllimport) void friend2(); 2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines friend __declspec(dllimport) void friend3(); 2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void friend1(); 2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void friend2(); // dllimport ignored 2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void friend3() {} // dllimport ignored 292176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 293176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines__declspec(dllimport) void friend4(); 294176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines__declspec(dllimport) void friend5(); 295176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct FuncFriendRedecl { 296176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines friend void friend4(); // dllimport ignored 297176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines friend void ::friend5(); 298176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines}; 2996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(friend1) 3006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(friend2) 3016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(friend3) 302176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesUSE(friend4) 303176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesUSE(friend5) 3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Implicit declarations can be redeclared with dllimport. 3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport noalias i8* @"\01??2@{{YAPAXI|YAPEAX_K}}@Z"( 3076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport noalias i8* @_Znw{{[yj]}}( 3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void* operator new(__SIZE_TYPE__ n); 3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UNIQ(use)() { ::operator new(42); } 3106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?externalFunc@ns@@YAXXZ"() 3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_ZN2ns12externalFuncEv() 3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ns { __declspec(dllimport) void externalFunc(); } 3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(ns::externalFunc) 3156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 3196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Function templates 3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===// 3216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import function template declaration. 3236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmplDecl@UImplicitInst_Imported@@@@YAXXZ"() 3246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z12funcTmplDeclI21ImplicitInst_ImportedEvv() 3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplDecl(); 3266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplDecl<ImplicitInst_Imported>) 3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Function template definitions cannot be imported. 3296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import inline function template. 3316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl1@UImplicitInst_Imported@@@@YAXXZ"() 332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z15inlineFuncTmpl1I21ImplicitInst_ImportedEvv() 3336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl1@UImplicitInst_Imported@@@@YAXXZ"() 334176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z15inlineFuncTmpl1I21ImplicitInst_ImportedEvv() 3356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) inline void inlineFuncTmpl1() {} 3366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl1<ImplicitInst_Imported>) 3376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl2@UImplicitInst_Imported@@@@YAXXZ"() 339176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z15inlineFuncTmpl2I21ImplicitInst_ImportedEvv() 3406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl2@UImplicitInst_Imported@@@@YAXXZ"() 341176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z15inlineFuncTmpl2I21ImplicitInst_ImportedEvv() 3426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> inline void __attribute__((dllimport)) inlineFuncTmpl2() {} 3436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl2<ImplicitInst_Imported>) 3446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmplDecl@UImplicitInst_Imported@@@@YAXXZ"() 346176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z18inlineFuncTmplDeclI21ImplicitInst_ImportedEvv() 3476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmplDecl@UImplicitInst_Imported@@@@YAXXZ"() 348176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z18inlineFuncTmplDeclI21ImplicitInst_ImportedEvv() 3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) inline void inlineFuncTmplDecl(); 3506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void inlineFuncTmplDecl() {} 3516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmplDecl<ImplicitInst_Imported>) 3526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmplDef@UImplicitInst_Imported@@@@YAXXZ"() 354176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z17inlineFuncTmplDefI21ImplicitInst_ImportedEvv() 3556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmplDef@UImplicitInst_Imported@@@@YAXXZ"() 356176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z17inlineFuncTmplDefI21ImplicitInst_ImportedEvv() 3576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void inlineFuncTmplDef(); 3586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> inline void inlineFuncTmplDef() {} 3596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmplDef<ImplicitInst_Imported>) 3606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Redeclarations 3636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmplRedecl1@UImplicitInst_Imported@@@@YAXXZ"() 3646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z15funcTmplRedecl1I21ImplicitInst_ImportedEvv() 3656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl1(); 3666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl1(); 3676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplRedecl1<ImplicitInst_Imported>) 3686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare void @"\01??$funcTmplRedecl2@UImplicitInst_NotImported@@@@YAXXZ"() 3706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare void @_Z15funcTmplRedecl2I24ImplicitInst_NotImportedEvv() 3716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl2(); 3726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void funcTmplRedecl2(); // dllimport ignored 3736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplRedecl2<ImplicitInst_NotImported>) 3746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define linkonce_odr void @"\01??$funcTmplRedecl3@UImplicitInst_NotImported@@@@YAXXZ"() 3766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define linkonce_odr void @_Z15funcTmplRedecl3I24ImplicitInst_NotImportedEvv() 3776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl3(); 3786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void funcTmplRedecl3() {} // dllimport ignored 3796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplRedecl3<ImplicitInst_NotImported>) 3806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 3826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Function template friends 3836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmplFriend1@UImplicitInst_Imported@@@@YAXXZ"() 3846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z15funcTmplFriend1I21ImplicitInst_ImportedEvv() 3856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare void @"\01??$funcTmplFriend2@UImplicitInst_NotImported@@@@YAXXZ"() 3866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare void @_Z15funcTmplFriend2I24ImplicitInst_NotImportedEvv() 3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define linkonce_odr void @"\01??$funcTmplFriend3@UImplicitInst_NotImported@@@@YAXXZ"() 3886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define linkonce_odr void @_Z15funcTmplFriend3I24ImplicitInst_NotImportedEvv() 3896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmplFriend4@UImplicitInst_Imported@@@@YAXXZ"() 390176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z15funcTmplFriend4I21ImplicitInst_ImportedEvv() 3916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct FuncTmplFriend { 3926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename T> friend __declspec(dllimport) void funcTmplFriend1(); 3936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename T> friend __declspec(dllimport) void funcTmplFriend2(); 3946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename T> friend __declspec(dllimport) void funcTmplFriend3(); 3956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename T> friend __declspec(dllimport) inline void funcTmplFriend4(); 3966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 3976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplFriend1(); 3986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void funcTmplFriend2(); // dllimport ignored 3996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void funcTmplFriend3() {} // dllimport ignored 4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> inline void funcTmplFriend4() {} 4016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend1<ImplicitInst_Imported>) 4026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend2<ImplicitInst_NotImported>) 4036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend3<ImplicitInst_NotImported>) 4046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend4<ImplicitInst_Imported>) 4056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$externalFuncTmpl@UImplicitInst_Imported@@@ns@@YAXXZ"() 4076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_ZN2ns16externalFuncTmplI21ImplicitInst_ImportedEEvv() 4086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ns { template<typename T> __declspec(dllimport) void externalFuncTmpl(); } 4096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(ns::externalFuncTmpl<ImplicitInst_Imported>) 4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void funcTmpl() {} 4136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> inline void inlineFuncTmpl() {} 4146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void importedFuncTmplDecl(); 4156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) inline void importedFuncTmpl() {} 4166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import implicit instantiation of an imported function template. 4186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmplDecl@UImplicitInst_Imported@@@@YAXXZ"() 4196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z20importedFuncTmplDeclI21ImplicitInst_ImportedEvv() 4206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmplDecl<ImplicitInst_Imported>) 4216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UImplicitInst_Imported@@@@YAXXZ"() 423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z16importedFuncTmplI21ImplicitInst_ImportedEvv() 4246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UImplicitInst_Imported@@@@YAXXZ"() 425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z16importedFuncTmplI21ImplicitInst_ImportedEvv() 4266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ImplicitInst_Imported>) 4276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation declaration of an imported function template. 4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"() 430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: declare void @_Z16importedFuncTmplI21ExplicitDecl_ImportedEvv() 4316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"() 432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define available_externally void @_Z16importedFuncTmplI21ExplicitDecl_ImportedEvv() 4336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template void importedFuncTmpl<ExplicitDecl_Imported>(); 4346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitDecl_Imported>) 4356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation definition of an imported function template. 4376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"() 438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define weak_odr void @_Z16importedFuncTmplI21ExplicitInst_ImportedEvv() 4396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"() 440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define weak_odr void @_Z16importedFuncTmplI21ExplicitInst_ImportedEvv() 4416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate void importedFuncTmpl<ExplicitInst_Imported>(); 4426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitInst_Imported>) 4436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import specialization of an imported function template. 4466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_Imported@@@@YAXXZ"() 4476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z20importedFuncTmplDeclI21ExplicitSpec_ImportedEvv() 4486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) void importedFuncTmplDecl<ExplicitSpec_Imported>(); 4496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmplDecl<ExplicitSpec_Imported>) 4506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG-FIXME: declare dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_Def_Imported@@@@YAXXZ"() 4526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG-FIXME: define available_externally dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_Def_Imported@@@@YAXXZ"() 4536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#ifdef MSABI 4546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//template<> __declspec(dllimport) void importedFuncTmplDecl<ExplicitSpec_Def_Imported>() {} 4556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//USE(importedFuncTmplDecl<ExplicitSpec_Def_Imported>) 4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 4576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"() 459176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z20importedFuncTmplDeclI31ExplicitSpec_InlineDef_ImportedEvv() 4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"() 461176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z20importedFuncTmplDeclI31ExplicitSpec_InlineDef_ImportedEvv() 4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) inline void importedFuncTmplDecl<ExplicitSpec_InlineDef_Imported>() {} 4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmplDecl<ExplicitSpec_InlineDef_Imported>) 4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_Imported@@@@YAXXZ"() 4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z16importedFuncTmplI21ExplicitSpec_ImportedEvv() 4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) void importedFuncTmpl<ExplicitSpec_Imported>(); 4696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitSpec_Imported>) 4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG-FIXME: declare dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"() 4726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG-FIXME: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"() 4736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#ifdef MSABI 4746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//template<> __declspec(dllimport) void importedFuncTmpl<ExplicitSpec_Def_Imported>() {} 4756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//USE(importedFuncTmpl<ExplicitSpec_Def_Imported>) 4766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 4776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"() 479176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z16importedFuncTmplI31ExplicitSpec_InlineDef_ImportedEvv() 4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"() 481176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z16importedFuncTmplI31ExplicitSpec_InlineDef_ImportedEvv() 4826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) inline void importedFuncTmpl<ExplicitSpec_InlineDef_Imported>() {} 4836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitSpec_InlineDef_Imported>) 4846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Not importing specialization of an imported function template without 4876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// explicit dllimport. 4886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define void @"\01??$importedFuncTmpl@UExplicitSpec_NotImported@@@@YAXXZ"() 4896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define void @_Z16importedFuncTmplI24ExplicitSpec_NotImportedEvv() 4906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> void importedFuncTmpl<ExplicitSpec_NotImported>() {} 4916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitSpec_NotImported>) 4926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation declaration of a non-imported function template. 4956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitDecl_Imported@@@@YAXXZ"() 4966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"() 4976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8funcTmplI21ExplicitDecl_ImportedEvv() 498176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: declare void @_Z14inlineFuncTmplI21ExplicitDecl_ImportedEvv() 4996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"() 500176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define available_externally void @_Z14inlineFuncTmplI21ExplicitDecl_ImportedEvv() 5016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template __declspec(dllimport) void funcTmpl<ExplicitDecl_Imported>(); 5026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template __declspec(dllimport) void inlineFuncTmpl<ExplicitDecl_Imported>(); 5036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitDecl_Imported>) 5046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl<ExplicitDecl_Imported>) 5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation definition of a non-imported function template. 5086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitInst_Imported@@@@YAXXZ"() 5096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"() 5106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8funcTmplI21ExplicitInst_ImportedEvv() 511176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define weak_odr void @_Z14inlineFuncTmplI21ExplicitInst_ImportedEvv() 5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$funcTmpl@UExplicitInst_Imported@@@@YAXXZ"() 5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"() 5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z8funcTmplI21ExplicitInst_ImportedEvv() 515176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define weak_odr void @_Z14inlineFuncTmplI21ExplicitInst_ImportedEvv() 5166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate __declspec(dllimport) void funcTmpl<ExplicitInst_Imported>(); 5176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate __declspec(dllimport) void inlineFuncTmpl<ExplicitInst_Imported>(); 5186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitInst_Imported>) 5196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl<ExplicitInst_Imported>) 5206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import specialization of a non-imported function template. 5236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitSpec_Imported@@@@YAXXZ"() 5246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8funcTmplI21ExplicitSpec_ImportedEvv() 5256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) void funcTmpl<ExplicitSpec_Imported>(); 5266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitSpec_Imported>) 5276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG-FIXME: declare dllimport void @"\01??$funcTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"() 5296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG-FIXME: define available_externally dllimport void @"\01??$funcTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"() 5306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#ifdef MSABI 5316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//template<> __declspec(dllimport) void funcTmpl<ExplicitSpec_Def_Imported>() {} 5326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//USE(funcTmpl<ExplicitSpec_Def_Imported>) 5336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif 5346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 5356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"() 536176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GNU-DAG: define linkonce_odr void @_Z8funcTmplI31ExplicitSpec_InlineDef_ImportedEvv() 5376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$funcTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"() 538176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// GO1-DAG: define linkonce_odr void @_Z8funcTmplI31ExplicitSpec_InlineDef_ImportedEvv() 5396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) inline void funcTmpl<ExplicitSpec_InlineDef_Imported>() {} 5406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitSpec_InlineDef_Imported>) 541c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 542c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 543c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 544c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines//===----------------------------------------------------------------------===// 545c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Classes 546c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines//===----------------------------------------------------------------------===// 547c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 548c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) T { 549c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines void a() {} 550c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?a@T@@QAEXXZ" 551c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 552c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static int b; 553c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MO1-DAG: @"\01?b@T@@2HA" = external dllimport global i32 554c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 555c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines T& operator=(T&) = default; 556176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // MO1-DAG: define available_externally dllimport x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.T* @"\01??4T@@QAEAAU0@AAU0@@Z" 557c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 558c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines T& operator=(T&&) = default; 559c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Note: Don't mark inline move operators dllimport because current MSVC versions don't export them. 560176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // MO1-DAG: define linkonce_odr x86_thiscallcc dereferenceable({{[0-9]+}}) %struct.T* @"\01??4T@@QAEAAU0@$$QAU0@@Z" 561c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 562c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(T, a) 563c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEVAR(T::b) 564c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSECOPYASSIGN(T) 565c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMOVEASSIGN(T) 566c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 567c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct __declspec(dllimport) U { void foo() {} }; 568c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?foo@?$U@H@@QAEXXZ" 569c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) V : public U<int> { }; 570c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(V, foo) 571c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 572c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) W { virtual void foo() {} }; 573c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSECLASS(W) 574c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// vftable: 575c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MO1-DAG: @"\01??_7W@@6B@" = available_externally dllimport unnamed_addr constant [1 x i8*] [i8* bitcast (void (%struct.W*)* @"\01?foo@W@@UAEXXZ" to i8*)] 576c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// GO1-DAG: @_ZTV1W = available_externally dllimport unnamed_addr constant [3 x i8*] [i8* null, i8* null, i8* bitcast (void (%struct.W*)* @_ZN1W3fooEv to i8*)] 577c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 578c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) KeyFuncClass { 579c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines constexpr KeyFuncClass() {} 580c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines virtual void foo(); 581c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 582c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesconstexpr KeyFuncClass keyFuncClassVar; 583c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: @_ZTV12KeyFuncClass = external dllimport unnamed_addr constant [3 x i8*] 584c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 585c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) X : public virtual W {}; 586c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSECLASS(X) 587c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// vbtable: 588c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MO1-DAG: @"\01??_8X@@7B@" = available_externally dllimport unnamed_addr constant [2 x i32] [i32 0, i32 4] 589c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 590c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) Y { 591c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int x; 592c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines}; 593c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 594c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) Z { virtual ~Z() {} }; 595c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSECLASS(Z) 596c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// User-defined dtor: 597c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01??1Z@@UAE@XZ" 598c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 599c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace DontUseDtorAlias { 600c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct __declspec(dllimport) A { ~A(); }; 601c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct __declspec(dllimport) B : A { ~B(); }; 602c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines inline A::~A() { } 603c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines inline B::~B() { } 604c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Emit a real definition of B's constructor; don't alias it to A's. 605c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MO1-DAG: available_externally dllimport x86_thiscallcc void @"\01??1B@DontUseDtorAlias@@QAE@XZ" 606c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines USECLASS(B) 607c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 608c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 609c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace Vtordisp { 610c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Don't dllimport the vtordisp. 611c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MO1-DAG: define linkonce_odr x86_thiscallcc void @"\01?f@?$C@D@Vtordisp@@$4PPPPPPPM@A@AEXXZ" 612c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 613c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines class Base { 614c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines virtual void f() {} 615c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 616c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> 617c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines class __declspec(dllimport) C : virtual public Base { 618c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines public: 619c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines C() {} 620c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines virtual void f() {} 621c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 622c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template class C<char>; 623c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 624c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 625c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace ClassTemplateStaticDef { 626c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Regular template static field: 627c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> struct __declspec(dllimport) S { 628c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static int x; 629c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 630c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> int S<T>::x; 631c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MSC-DAG: @"\01?x@?$S@H@ClassTemplateStaticDef@@2HA" = available_externally dllimport global i32 0 632c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int f() { return S<int>::x; } 633c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 634c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // Partial class template specialization static field: 635c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename A> struct T; 636c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename A> struct __declspec(dllimport) T<A*> { 637c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines static int x; 638c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines }; 639c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename A> int T<A*>::x; 640c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // GNU-DAG: @_ZN22ClassTemplateStaticDef1TIPvE1xE = available_externally dllimport global i32 0 641c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int g() { return T<void*>::x; } 642c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 643c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 644c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesnamespace PR19933 { 645c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Don't dynamically initialize dllimport vars. 646c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MSC2-NOT: @llvm.global_ctors 647c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// GNU2-NOT: @llvm.global_ctors 648c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 649c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines struct NonPOD { NonPOD(); }; 650c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> struct A { static NonPOD x; }; 651c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> NonPOD A<T>::x; 652c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template struct __declspec(dllimport) A<int>; 653c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MSC-DAG: @"\01?x@?$A@H@PR19933@@2UNonPOD@2@A" = available_externally dllimport global %"struct.PR19933::NonPOD" zeroinitializer 654c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 655c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines int f(); 656c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> struct B { static int x; }; 657c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> int B<T>::x = f(); 658c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template struct __declspec(dllimport) B<int>; 659c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MSC-DAG: @"\01?x@?$B@H@PR19933@@2HA" = available_externally dllimport global i32 0 660c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 661c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines constexpr int g() { return 42; } 662c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> struct C { static int x; }; 663c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <typename T> int C<T>::x = g(); 664c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template struct __declspec(dllimport) C<int>; 665c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MSC-DAG: @"\01?x@?$C@H@PR19933@@2HA" = available_externally dllimport global i32 42 666c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 667c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <int I> struct D { static int x, y; }; 668c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <int I> int D<I>::x = I + 1; 669c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template <int I> int D<I>::y = I + f(); 670c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines template struct __declspec(dllimport) D<42>; 671c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MSC-DAG: @"\01?x@?$D@$0CK@@PR19933@@2HA" = available_externally dllimport global i32 43 672c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines // MSC-DAG: @"\01?y@?$D@$0CK@@PR19933@@2HA" = available_externally dllimport global i32 0 673c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines} 674c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 675176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR21355 { 676176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct __declspec(dllimport) S { 677176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines virtual ~S(); 678176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 679176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines S::~S() {} 680176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 681176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // S::~S is a key function, so we would ordinarily emit a strong definition for 682176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // the vtable. However, S is imported, so the vtable should be too. 683176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 684176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // GNU-DAG: @_ZTVN7PR213551SE = available_externally dllimport unnamed_addr constant [4 x i8*] 685176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 686176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 687176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace PR21366 { 688176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines struct __declspec(dllimport) S { 689176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void outOfLineMethod(); 690176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void inlineMethod() {} 691176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines inline void anotherInlineMethod(); 692176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void outOfClassInlineMethod(); 693176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines }; 694176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines void S::anotherInlineMethod() {} 695176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines inline void S::outOfClassInlineMethod() {} 696176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 697176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 698c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MS ignores DLL attributes on partial specializations. 699c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct PartiallySpecializedClassTemplate {}; 700176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename T> struct __declspec(dllimport) PartiallySpecializedClassTemplate<T*> { void f(); }; 701c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(PartiallySpecializedClassTemplate<void*>, f); 702176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: declare x86_thiscallcc void @"\01?f@?$PartiallySpecializedClassTemplate@PAX@@QAEXXZ" 703176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// G32-DAG: declare dllimport x86_thiscallcc void @_ZN33PartiallySpecializedClassTemplateIPvE1fEv 704c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 705176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Attributes on explicit specializations are honored. 706c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct ExplicitlySpecializedClassTemplate {}; 707176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <> struct __declspec(dllimport) ExplicitlySpecializedClassTemplate<void*> { void f(); }; 708c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExplicitlySpecializedClassTemplate<void*>, f); 709176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: declare dllimport x86_thiscallcc void @"\01?f@?$ExplicitlySpecializedClassTemplate@PAX@@QAEXXZ" 710176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// G32-DAG: declare dllimport x86_thiscallcc void @_ZN34ExplicitlySpecializedClassTemplateIPvE1fEv 711176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 712176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// MS inherits DLL attributes to partial specializations. 713176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename T> struct __declspec(dllimport) PartiallySpecializedImportedClassTemplate {}; 714176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename T> struct PartiallySpecializedImportedClassTemplate<T*> { void f() {} }; 715176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesUSEMEMFUNC(PartiallySpecializedImportedClassTemplate<void*>, f); 716176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?f@?$PartiallySpecializedImportedClassTemplate@PAX@@QAEXXZ" 717176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN41PartiallySpecializedImportedClassTemplateIPvE1fEv 718176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 719176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Attributes on the instantiation take precedence over attributes on the template. 720176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename T> struct __declspec(dllexport) ExplicitlyInstantiatedWithDifferentAttr { void f() {} }; 721176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate struct __declspec(dllimport) ExplicitlyInstantiatedWithDifferentAttr<int>; 722176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesUSEMEMFUNC(ExplicitlyInstantiatedWithDifferentAttr<int>, f); 723176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?f@?$ExplicitlyInstantiatedWithDifferentAttr@H@@QAEXXZ" 724176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 725c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 726c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines//===----------------------------------------------------------------------===// 727c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Classes with template base classes 728c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines//===----------------------------------------------------------------------===// 729c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 730c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct ClassTemplate { void func() {} }; 7310e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <typename T> struct __declspec(dllexport) ExportedClassTemplate { void func(); }; 7320e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <typename T> void ExportedClassTemplate<T>::func() {} 733176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename T> struct __declspec(dllimport) ImportedClassTemplate { void func(); }; 734c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 735c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct ExplicitlySpecializedTemplate { void func() {} }; 736c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <> struct ExplicitlySpecializedTemplate<int> { void func() {} }; 737c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct ExplicitlyExportSpecializedTemplate { void func() {} }; 7380e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <> struct __declspec(dllexport) ExplicitlyExportSpecializedTemplate<int> { void func(); }; 7390e2c34f92f00628d48968dfea096d36381f494cbStephen Hinesvoid ExplicitlyExportSpecializedTemplate<int>::func() {} 740c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct ExplicitlyImportSpecializedTemplate { void func() {} }; 741176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <> struct __declspec(dllimport) ExplicitlyImportSpecializedTemplate<int> { void func(); }; 742c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 743c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct ExplicitlyInstantiatedTemplate { void func() {} }; 744c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate struct ExplicitlyInstantiatedTemplate<int>; 7450e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <typename T> struct ExplicitlyExportInstantiatedTemplate { void func(); }; 7460e2c34f92f00628d48968dfea096d36381f494cbStephen Hinestemplate <typename T> void ExplicitlyExportInstantiatedTemplate<T>::func() {} 747c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate struct __declspec(dllexport) ExplicitlyExportInstantiatedTemplate<int>; 748176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinestemplate <typename T> struct ExplicitlyImportInstantiatedTemplate { void func(); }; 749c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate struct __declspec(dllimport) ExplicitlyImportInstantiatedTemplate<int>; 750c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 751c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 752c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MS: ClassTemplate<int> gets imported. 753c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromTemplate : public ClassTemplate<int> {}; 754c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ClassTemplate<int>, func) 755c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?func@?$ClassTemplate@H@@QAEXXZ" 756c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ClassTemplateIiE4funcEv 757c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 758c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// ImportedTemplate is explicitly imported. 759c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromImportedTemplate : public ImportedClassTemplate<int> {}; 760c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ImportedClassTemplate<int>, func) 761176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: declare dllimport x86_thiscallcc void @"\01?func@?$ImportedClassTemplate@H@@QAEXXZ" 762c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: declare dllimport x86_thiscallcc void @_ZN21ImportedClassTemplateIiE4funcEv 763c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 764c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// ExportedTemplate is explicitly exported. 765c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromExportedTemplate : public ExportedClassTemplate<int> {}; 766c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExportedClassTemplate<int>, func) 767c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?func@?$ExportedClassTemplate@H@@QAEXXZ" 768c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define weak_odr dllexport x86_thiscallcc void @_ZN21ExportedClassTemplateIiE4funcEv 769c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 770c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Base class already instantiated without attribute. 771c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct DerivedFromTemplateD : public ClassTemplate<double> {}; 772c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromTemplateD2 : public ClassTemplate<double> {}; 773c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ClassTemplate<double>, func) 774c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: define linkonce_odr x86_thiscallcc void @"\01?func@?$ClassTemplate@N@@QAEXXZ" 775c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ClassTemplateIdE4funcEv 776c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 777c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MS: Base class already instantiated with dfferent attribute. 778c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllexport) DerivedFromTemplateB : public ClassTemplate<bool> {}; 779c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromTemplateB2 : public ClassTemplate<bool> {}; 780c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ClassTemplate<bool>, func) 781c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?func@?$ClassTemplate@_N@@QAEXXZ" 782c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ClassTemplateIbE4funcEv 783c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 784c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Base class already specialized without dll attribute. 785c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlySpecializedTemplate : public ExplicitlySpecializedTemplate<int> {}; 786c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExplicitlySpecializedTemplate<int>, func) 787c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: define linkonce_odr x86_thiscallcc void @"\01?func@?$ExplicitlySpecializedTemplate@H@@QAEXXZ" 788c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN29ExplicitlySpecializedTemplateIiE4funcEv 789c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 790c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Base class alredy specialized with export attribute. 791c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyExportSpecializedTemplate : public ExplicitlyExportSpecializedTemplate<int> {}; 792c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExplicitlyExportSpecializedTemplate<int>, func) 7930e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// M32-DAG: define dllexport x86_thiscallcc void @"\01?func@?$ExplicitlyExportSpecializedTemplate@H@@QAEXXZ" 7940e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// G32-DAG: define dllexport x86_thiscallcc void @_ZN35ExplicitlyExportSpecializedTemplateIiE4funcEv 795c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 796c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Base class already specialized with import attribute. 797c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyImportSpecializedTemplate : public ExplicitlyImportSpecializedTemplate<int> {}; 798c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExplicitlyImportSpecializedTemplate<int>, func) 799176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: declare dllimport x86_thiscallcc void @"\01?func@?$ExplicitlyImportSpecializedTemplate@H@@QAEXXZ" 800176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// G32-DAG: declare dllimport x86_thiscallcc void @_ZN35ExplicitlyImportSpecializedTemplateIiE4funcEv 801c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 802c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Base class already instantiated without dll attribute. 803c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyInstantiatedTemplate : public ExplicitlyInstantiatedTemplate<int> {}; 804c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExplicitlyInstantiatedTemplate<int>, func) 805c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: define weak_odr x86_thiscallcc void @"\01?func@?$ExplicitlyInstantiatedTemplate@H@@QAEXXZ" 806c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define weak_odr x86_thiscallcc void @_ZN30ExplicitlyInstantiatedTemplateIiE4funcEv 807c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 808c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Base class already instantiated with export attribute. 809c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyExportInstantiatedTemplate : public ExplicitlyExportInstantiatedTemplate<int> {}; 810c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExplicitlyExportInstantiatedTemplate<int>, func) 811c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?func@?$ExplicitlyExportInstantiatedTemplate@H@@QAEXXZ" 812c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define weak_odr dllexport x86_thiscallcc void @_ZN36ExplicitlyExportInstantiatedTemplateIiE4funcEv 813c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 814c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// Base class already instantiated with import attribute. 815c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyImportInstantiatedTemplate : public ExplicitlyImportInstantiatedTemplate<int> {}; 816c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(ExplicitlyImportInstantiatedTemplate<int>, func) 817176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// M32-DAG: declare dllimport x86_thiscallcc void @"\01?func@?$ExplicitlyImportInstantiatedTemplate@H@@QAEXXZ" 818176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// G32-DAG: declare dllimport x86_thiscallcc void @_ZN36ExplicitlyImportInstantiatedTemplateIiE4funcEv 819c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines 820c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// MS: A dll attribute propagates through multiple levels of instantiation. 821c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct TopClass { void func() {} }; 822c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hinestemplate <typename T> struct MiddleClass : public TopClass<T> { }; 823176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct __declspec(dllimport) BottomClass : public MiddleClass<int> { }; 824c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen HinesUSEMEMFUNC(TopClass<int>, func) 825c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?func@?$TopClass@H@@QAEXXZ" 826c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN8TopClassIiE4funcEv 827