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