1ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple i686-windows-msvc   -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -DMSABI | FileCheck --check-prefix=MSC --check-prefix=M32 %s
2ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple x86_64-windows-msvc -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -DMSABI | FileCheck --check-prefix=MSC --check-prefix=M64 %s
3ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple i686-windows-gnu    -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s         | FileCheck --check-prefix=GNU --check-prefix=G32 %s
4ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple x86_64-windows-gnu  -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s         | FileCheck --check-prefix=GNU --check-prefix=G64 %s
5ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple i686-windows-msvc   -fno-rtti -emit-llvm -std=c++1y -O1 -o - %s -DMSABI | FileCheck --check-prefix=MO1 %s
6ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple i686-windows-gnu    -fno-rtti -emit-llvm -std=c++1y -O1 -o - %s         | FileCheck --check-prefix=GO1 %s
7ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
8ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// CHECK-NOT doesn't play nice with CHECK-DAG, so use separate run lines.
9ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple i686-windows-msvc   -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s -DMSABI | FileCheck --check-prefix=MSC2 %s
10ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// RUN: %clang_cc1 -triple i686-windows-gnu    -fno-rtti -emit-llvm -std=c++1y -O0 -o - %s         | 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(); }
28ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#define USEMEMFUNC(class, func) void (class::*UNIQ(use)())() { return &class::func; }
29ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#define USECLASS(class) void UNIQ(USE)() { class x; }
30ef8225444452a1486bd721f3285301fe84643b00Stephen Hines#define USECOPYASSIGN(class) class& (class::*UNIQ(use)())(class&) { return &class::operator=; }
31ef8225444452a1486bd721f3285301fe84643b00Stephen 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
88ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint f();
89ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MO1-DAG: @"\01?x@?1??inlineStaticLocalsFunc@@YAHXZ@4HA" = available_externally dllimport global i32 0
90ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MO1-DAG: @"\01??_B?1??inlineStaticLocalsFunc@@YAHXZ@51" = available_externally dllimport global i32 0
91ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesinline int __declspec(dllimport) inlineStaticLocalsFunc() {
92ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  static int x = f();
93ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return x++;
94ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
95ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSE(inlineStaticLocalsFunc);
96ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
97ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// The address of a dllimport global cannot be used in constant initialization.
98ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: @"\01?arr@?0??initializationFunc@@YAPAHXZ@4QBQAHB" = internal global [1 x i32*] zeroinitializer
99ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// GNU-DAG: @_ZZ18initializationFuncvE3arr = internal global [1 x i32*] zeroinitializer
100ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint *initializationFunc() {
101ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  static int *const arr[] = {&ExternGlobalDecl};
102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return arr[0];
103ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
104ef8225444452a1486bd721f3285301fe84643b00Stephen 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"()
2176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z10inlineFuncv()
2186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01?inlineFunc@@YAXXZ"()
2196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z10inlineFuncv()
2206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) inline void inlineFunc() {}
2216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFunc)
2226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?inlineDecl@@YAXXZ"()
2246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z10inlineDeclv()
2256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01?inlineDecl@@YAXXZ"()
2266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport 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"()
2326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z9inlineDefv()
2336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01?inlineDef@@YAXXZ"()
2346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport 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"()
2416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8noinlinev()
2426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) __attribute__((noinline)) inline void noinline() {}
2436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(noinline)
2446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
245ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MSC2-NOT: @"\01?alwaysInline@@YAXXZ"()
246ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// GNU2-NOT: @_Z12alwaysInlinev()
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()
2796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct FuncFriend {
2806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  friend __declspec(dllimport) void friend1();
2816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  friend __declspec(dllimport) void friend2();
2826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  friend __declspec(dllimport) void friend3();
2836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
2846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void friend1();
2856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      void friend2(); // dllimport ignored
2866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                      void friend3() {} // dllimport ignored
2876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(friend1)
2886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(friend2)
2896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(friend3)
2906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Implicit declarations can be redeclared with dllimport.
2926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport noalias i8* @"\01??2@{{YAPAXI|YAPEAX_K}}@Z"(
2936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport noalias i8* @_Znw{{[yj]}}(
2946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void* operator new(__SIZE_TYPE__ n);
2956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid UNIQ(use)() { ::operator new(42); }
2966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01?externalFunc@ns@@YAXXZ"()
2986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_ZN2ns12externalFuncEv()
2996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ns { __declspec(dllimport) void externalFunc(); }
3006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(ns::externalFunc)
3016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===//
3056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Function templates
3066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//===----------------------------------------------------------------------===//
3076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import function template declaration.
3096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmplDecl@UImplicitInst_Imported@@@@YAXXZ"()
3106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z12funcTmplDeclI21ImplicitInst_ImportedEvv()
3116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplDecl();
3126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplDecl<ImplicitInst_Imported>)
3136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Function template definitions cannot be imported.
3156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import inline function template.
3176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl1@UImplicitInst_Imported@@@@YAXXZ"()
3186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z15inlineFuncTmpl1I21ImplicitInst_ImportedEvv()
3196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl1@UImplicitInst_Imported@@@@YAXXZ"()
3206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z15inlineFuncTmpl1I21ImplicitInst_ImportedEvv()
3216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) inline void inlineFuncTmpl1() {}
3226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl1<ImplicitInst_Imported>)
3236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl2@UImplicitInst_Imported@@@@YAXXZ"()
3256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z15inlineFuncTmpl2I21ImplicitInst_ImportedEvv()
3266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl2@UImplicitInst_Imported@@@@YAXXZ"()
3276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z15inlineFuncTmpl2I21ImplicitInst_ImportedEvv()
3286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> inline void __attribute__((dllimport)) inlineFuncTmpl2() {}
3296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl2<ImplicitInst_Imported>)
3306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmplDecl@UImplicitInst_Imported@@@@YAXXZ"()
3326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z18inlineFuncTmplDeclI21ImplicitInst_ImportedEvv()
3336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmplDecl@UImplicitInst_Imported@@@@YAXXZ"()
3346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z18inlineFuncTmplDeclI21ImplicitInst_ImportedEvv()
3356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) inline void inlineFuncTmplDecl();
3366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T>                              void inlineFuncTmplDecl() {}
3376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmplDecl<ImplicitInst_Imported>)
3386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmplDef@UImplicitInst_Imported@@@@YAXXZ"()
3406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z17inlineFuncTmplDefI21ImplicitInst_ImportedEvv()
3416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmplDef@UImplicitInst_Imported@@@@YAXXZ"()
3426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z17inlineFuncTmplDefI21ImplicitInst_ImportedEvv()
3436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void inlineFuncTmplDef();
3446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T>                inline void inlineFuncTmplDef() {}
3456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmplDef<ImplicitInst_Imported>)
3466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Redeclarations
3496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmplRedecl1@UImplicitInst_Imported@@@@YAXXZ"()
3506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z15funcTmplRedecl1I21ImplicitInst_ImportedEvv()
3516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl1();
3526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl1();
3536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplRedecl1<ImplicitInst_Imported>)
3546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare void @"\01??$funcTmplRedecl2@UImplicitInst_NotImported@@@@YAXXZ"()
3566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare void @_Z15funcTmplRedecl2I24ImplicitInst_NotImportedEvv()
3576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl2();
3586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T>                       void funcTmplRedecl2(); // dllimport ignored
3596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplRedecl2<ImplicitInst_NotImported>)
3606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define linkonce_odr void @"\01??$funcTmplRedecl3@UImplicitInst_NotImported@@@@YAXXZ"()
3626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define linkonce_odr void @_Z15funcTmplRedecl3I24ImplicitInst_NotImportedEvv()
3636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplRedecl3();
3646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T>                       void funcTmplRedecl3() {} // dllimport ignored
3656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplRedecl3<ImplicitInst_NotImported>)
3666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Function template friends
3696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport   void @"\01??$funcTmplFriend1@UImplicitInst_Imported@@@@YAXXZ"()
3706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport   void @_Z15funcTmplFriend1I21ImplicitInst_ImportedEvv()
3716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare             void @"\01??$funcTmplFriend2@UImplicitInst_NotImported@@@@YAXXZ"()
3726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare             void @_Z15funcTmplFriend2I24ImplicitInst_NotImportedEvv()
3736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define linkonce_odr void @"\01??$funcTmplFriend3@UImplicitInst_NotImported@@@@YAXXZ"()
3746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define linkonce_odr void @_Z15funcTmplFriend3I24ImplicitInst_NotImportedEvv()
3756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport   void @"\01??$funcTmplFriend4@UImplicitInst_Imported@@@@YAXXZ"()
3766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport   void @_Z15funcTmplFriend4I21ImplicitInst_ImportedEvv()
3776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct FuncTmplFriend {
3786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> friend __declspec(dllimport) void funcTmplFriend1();
3796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> friend __declspec(dllimport) void funcTmplFriend2();
3806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> friend __declspec(dllimport) void funcTmplFriend3();
3816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<typename T> friend __declspec(dllimport) inline void funcTmplFriend4();
3826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
3836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void funcTmplFriend1();
3846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T>                       void funcTmplFriend2(); // dllimport ignored
3856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T>                       void funcTmplFriend3() {} // dllimport ignored
3866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T>                       inline void funcTmplFriend4() {}
3876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend1<ImplicitInst_Imported>)
3886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend2<ImplicitInst_NotImported>)
3896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend3<ImplicitInst_NotImported>)
3906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmplFriend4<ImplicitInst_Imported>)
3916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$externalFuncTmpl@UImplicitInst_Imported@@@ns@@YAXXZ"()
3936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_ZN2ns16externalFuncTmplI21ImplicitInst_ImportedEEvv()
3946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace ns { template<typename T> __declspec(dllimport) void externalFuncTmpl(); }
3956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(ns::externalFuncTmpl<ImplicitInst_Imported>)
3966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
3986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void funcTmpl() {}
3996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> inline void inlineFuncTmpl() {}
4006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) void importedFuncTmplDecl();
4016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> __declspec(dllimport) inline void importedFuncTmpl() {}
4026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import implicit instantiation of an imported function template.
4046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmplDecl@UImplicitInst_Imported@@@@YAXXZ"()
4056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z20importedFuncTmplDeclI21ImplicitInst_ImportedEvv()
4066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmplDecl<ImplicitInst_Imported>)
4076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UImplicitInst_Imported@@@@YAXXZ"()
4096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z16importedFuncTmplI21ImplicitInst_ImportedEvv()
4106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UImplicitInst_Imported@@@@YAXXZ"()
4116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z16importedFuncTmplI21ImplicitInst_ImportedEvv()
4126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ImplicitInst_Imported>)
4136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation declaration of an imported function template.
4156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"()
4166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z16importedFuncTmplI21ExplicitDecl_ImportedEvv()
4176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"()
4186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z16importedFuncTmplI21ExplicitDecl_ImportedEvv()
4196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template void importedFuncTmpl<ExplicitDecl_Imported>();
4206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitDecl_Imported>)
4216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation definition of an imported function template.
4236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"()
4246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z16importedFuncTmplI21ExplicitInst_ImportedEvv()
4256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"()
4266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z16importedFuncTmplI21ExplicitInst_ImportedEvv()
4276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate void importedFuncTmpl<ExplicitInst_Imported>();
4286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitInst_Imported>)
4296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import specialization of an imported function template.
4326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_Imported@@@@YAXXZ"()
4336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z20importedFuncTmplDeclI21ExplicitSpec_ImportedEvv()
4346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) void importedFuncTmplDecl<ExplicitSpec_Imported>();
4356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmplDecl<ExplicitSpec_Imported>)
4366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG-FIXME: declare dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_Def_Imported@@@@YAXXZ"()
4386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG-FIXME: define available_externally dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_Def_Imported@@@@YAXXZ"()
4396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#ifdef MSABI
4406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//template<> __declspec(dllimport) void importedFuncTmplDecl<ExplicitSpec_Def_Imported>() {}
4416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//USE(importedFuncTmplDecl<ExplicitSpec_Def_Imported>)
4426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
4436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"()
4456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z20importedFuncTmplDeclI31ExplicitSpec_InlineDef_ImportedEvv()
4466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmplDecl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"()
4476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z20importedFuncTmplDeclI31ExplicitSpec_InlineDef_ImportedEvv()
4486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) inline void importedFuncTmplDecl<ExplicitSpec_InlineDef_Imported>() {}
4496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmplDecl<ExplicitSpec_InlineDef_Imported>)
4506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_Imported@@@@YAXXZ"()
4536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z16importedFuncTmplI21ExplicitSpec_ImportedEvv()
4546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) void importedFuncTmpl<ExplicitSpec_Imported>();
4556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitSpec_Imported>)
4566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG-FIXME: declare dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"()
4586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG-FIXME: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"()
4596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#ifdef MSABI
4606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//template<> __declspec(dllimport) void importedFuncTmpl<ExplicitSpec_Def_Imported>() {}
4616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//USE(importedFuncTmpl<ExplicitSpec_Def_Imported>)
4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"()
4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z16importedFuncTmplI31ExplicitSpec_InlineDef_ImportedEvv()
4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$importedFuncTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"()
4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z16importedFuncTmplI31ExplicitSpec_InlineDef_ImportedEvv()
4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) inline void importedFuncTmpl<ExplicitSpec_InlineDef_Imported>() {}
4696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitSpec_InlineDef_Imported>)
4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Not importing specialization of an imported function template without
4736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// explicit dllimport.
4746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: define void @"\01??$importedFuncTmpl@UExplicitSpec_NotImported@@@@YAXXZ"()
4756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: define void @_Z16importedFuncTmplI24ExplicitSpec_NotImportedEvv()
4766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> void importedFuncTmpl<ExplicitSpec_NotImported>() {}
4776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(importedFuncTmpl<ExplicitSpec_NotImported>)
4786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation declaration of a non-imported function template.
4816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitDecl_Imported@@@@YAXXZ"()
4826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"()
4836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8funcTmplI21ExplicitDecl_ImportedEvv()
4846bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z14inlineFuncTmplI21ExplicitDecl_ImportedEvv()
4856bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl@UExplicitDecl_Imported@@@@YAXXZ"()
4866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z14inlineFuncTmplI21ExplicitDecl_ImportedEvv()
4876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template __declspec(dllimport) void funcTmpl<ExplicitDecl_Imported>();
4886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesextern template __declspec(dllimport) void inlineFuncTmpl<ExplicitDecl_Imported>();
4896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitDecl_Imported>)
4906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl<ExplicitDecl_Imported>)
4916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
4936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import explicit instantiation definition of a non-imported function template.
4946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitInst_Imported@@@@YAXXZ"()
4956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$inlineFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"()
4966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8funcTmplI21ExplicitInst_ImportedEvv()
4976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z14inlineFuncTmplI21ExplicitInst_ImportedEvv()
4986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$funcTmpl@UExplicitInst_Imported@@@@YAXXZ"()
4996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$inlineFuncTmpl@UExplicitInst_Imported@@@@YAXXZ"()
5006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z8funcTmplI21ExplicitInst_ImportedEvv()
5016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z14inlineFuncTmplI21ExplicitInst_ImportedEvv()
5026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate __declspec(dllimport) void funcTmpl<ExplicitInst_Imported>();
5036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate __declspec(dllimport) void inlineFuncTmpl<ExplicitInst_Imported>();
5046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitInst_Imported>)
5056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(inlineFuncTmpl<ExplicitInst_Imported>)
5066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Import specialization of a non-imported function template.
5096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitSpec_Imported@@@@YAXXZ"()
5106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8funcTmplI21ExplicitSpec_ImportedEvv()
5116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) void funcTmpl<ExplicitSpec_Imported>();
5126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitSpec_Imported>)
5136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG-FIXME: declare dllimport void @"\01??$funcTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"()
5156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG-FIXME: define available_externally dllimport void @"\01??$funcTmpl@UExplicitSpec_Def_Imported@@@@YAXXZ"()
5166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#ifdef MSABI
5176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//template<> __declspec(dllimport) void funcTmpl<ExplicitSpec_Def_Imported>() {}
5186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines//USE(funcTmpl<ExplicitSpec_Def_Imported>)
5196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines#endif
5206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
5216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MSC-DAG: declare dllimport void @"\01??$funcTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"()
5226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GNU-DAG: declare dllimport void @_Z8funcTmplI31ExplicitSpec_InlineDef_ImportedEvv()
5236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// MO1-DAG: define available_externally dllimport void @"\01??$funcTmpl@UExplicitSpec_InlineDef_Imported@@@@YAXXZ"()
5246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// GO1-DAG: define available_externally dllimport void @_Z8funcTmplI31ExplicitSpec_InlineDef_ImportedEvv()
5256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<> __declspec(dllimport) inline void funcTmpl<ExplicitSpec_InlineDef_Imported>() {}
5266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen HinesUSE(funcTmpl<ExplicitSpec_InlineDef_Imported>)
527ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
528ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
529ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
530ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//===----------------------------------------------------------------------===//
531ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Classes
532ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//===----------------------------------------------------------------------===//
533ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
534ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) T {
535ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  void a() {}
536ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?a@T@@QAEXXZ"
537ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
538ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  static int b;
539ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MO1-DAG: @"\01?b@T@@2HA" = external dllimport global i32
540ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
541ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  T& operator=(T&) = default;
542ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MO1-DAG: define available_externally dllimport x86_thiscallcc nonnull %struct.T* @"\01??4T@@QAEAAU0@AAU0@@Z"
543ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
544ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  T& operator=(T&&) = default;
545ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Note: Don't mark inline move operators dllimport because current MSVC versions don't export them.
546ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MO1-DAG: define linkonce_odr x86_thiscallcc nonnull %struct.T* @"\01??4T@@QAEAAU0@$$QAU0@@Z"
547ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
548ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(T, a)
549ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEVAR(T::b)
550ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSECOPYASSIGN(T)
551ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMOVEASSIGN(T)
552ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
553ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct __declspec(dllimport) U { void foo() {} };
554ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01?foo@?$U@H@@QAEXXZ"
555ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) V : public U<int> { };
556ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(V, foo)
557ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
558ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) W { virtual void foo() {} };
559ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSECLASS(W)
560ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// vftable:
561ef8225444452a1486bd721f3285301fe84643b00Stephen 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*)]
562ef8225444452a1486bd721f3285301fe84643b00Stephen 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*)]
563ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
564ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) KeyFuncClass {
565ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  constexpr KeyFuncClass() {}
566ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  virtual void foo();
567ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
568ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesconstexpr KeyFuncClass keyFuncClassVar;
569ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: @_ZTV12KeyFuncClass = external dllimport unnamed_addr constant [3 x i8*]
570ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
571ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) X : public virtual W {};
572ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSECLASS(X)
573ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// vbtable:
574ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MO1-DAG: @"\01??_8X@@7B@" = available_externally dllimport unnamed_addr constant [2 x i32] [i32 0, i32 4]
575ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
576ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) Y {
577ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int x;
578ef8225444452a1486bd721f3285301fe84643b00Stephen Hines};
579ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
580ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) Z { virtual ~Z() {} };
581ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSECLASS(Z)
582ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// User-defined dtor:
583ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MO1-DAG: define available_externally dllimport x86_thiscallcc void @"\01??1Z@@UAE@XZ"
584ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
585ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace DontUseDtorAlias {
586ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct __declspec(dllimport) A { ~A(); };
587ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct __declspec(dllimport) B : A { ~B(); };
588ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  inline A::~A() { }
589ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  inline B::~B() { }
590ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Emit a real definition of B's constructor; don't alias it to A's.
591ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MO1-DAG: available_externally dllimport x86_thiscallcc void @"\01??1B@DontUseDtorAlias@@QAE@XZ"
592ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  USECLASS(B)
593ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
594ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
595ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace Vtordisp {
596ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Don't dllimport the vtordisp.
597ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MO1-DAG: define linkonce_odr x86_thiscallcc void @"\01?f@?$C@D@Vtordisp@@$4PPPPPPPM@A@AEXXZ"
598ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
599ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  class Base {
600ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    virtual void f() {}
601ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  };
602ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T>
603ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  class __declspec(dllimport) C : virtual public Base {
604ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  public:
605ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    C() {}
606ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    virtual void f() {}
607ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  };
608ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template class C<char>;
609ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
610ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
611ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace ClassTemplateStaticDef {
612ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Regular template static field:
613ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> struct __declspec(dllimport) S {
614ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    static int x;
615ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  };
616ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> int S<T>::x;
617ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MSC-DAG: @"\01?x@?$S@H@ClassTemplateStaticDef@@2HA" = available_externally dllimport global i32 0
618ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int f() { return S<int>::x; }
619ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
620ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // Partial class template specialization static field:
621ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename A> struct T;
622ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename A> struct __declspec(dllimport) T<A*> {
623ef8225444452a1486bd721f3285301fe84643b00Stephen Hines    static int x;
624ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  };
625ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename A> int T<A*>::x;
626ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // GNU-DAG: @_ZN22ClassTemplateStaticDef1TIPvE1xE = available_externally dllimport global i32 0
627ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int g() { return T<void*>::x; }
628ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
629ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
630ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesnamespace PR19933 {
631ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Don't dynamically initialize dllimport vars.
632ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MSC2-NOT: @llvm.global_ctors
633ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// GNU2-NOT: @llvm.global_ctors
634ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
635ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  struct NonPOD { NonPOD(); };
636ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> struct A { static NonPOD x; };
637ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> NonPOD A<T>::x;
638ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template struct __declspec(dllimport) A<int>;
639ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MSC-DAG: @"\01?x@?$A@H@PR19933@@2UNonPOD@2@A" = available_externally dllimport global %"struct.PR19933::NonPOD" zeroinitializer
640ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
641ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  int f();
642ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> struct B { static int x; };
643ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> int B<T>::x = f();
644ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template struct __declspec(dllimport) B<int>;
645ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MSC-DAG: @"\01?x@?$B@H@PR19933@@2HA" = available_externally dllimport global i32 0
646ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
647ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  constexpr int g() { return 42; }
648ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> struct C { static int x; };
649ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <typename T> int C<T>::x = g();
650ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template struct __declspec(dllimport) C<int>;
651ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MSC-DAG: @"\01?x@?$C@H@PR19933@@2HA" = available_externally dllimport global i32 42
652ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
653ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <int I> struct D { static int x, y; };
654ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <int I> int D<I>::x = I + 1;
655ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template <int I> int D<I>::y = I + f();
656ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  template struct __declspec(dllimport) D<42>;
657ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MSC-DAG: @"\01?x@?$D@$0CK@@PR19933@@2HA" = available_externally dllimport global i32 43
658ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  // MSC-DAG: @"\01?y@?$D@$0CK@@PR19933@@2HA" = available_externally dllimport global i32 0
659ef8225444452a1486bd721f3285301fe84643b00Stephen Hines}
660ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
661ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MS ignores DLL attributes on partial specializations.
662ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct PartiallySpecializedClassTemplate {};
663ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct __declspec(dllimport) PartiallySpecializedClassTemplate<T*> { void f() {} };
664ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(PartiallySpecializedClassTemplate<void*>, f);
665ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define linkonce_odr x86_thiscallcc void @"\01?f@?$PartiallySpecializedClassTemplate@PAX@@QAEXXZ"
666ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @_ZN33PartiallySpecializedClassTemplateIPvE1fEv
667ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
668ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ExplicitlySpecializedClassTemplate {};
669ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <> struct __declspec(dllimport) ExplicitlySpecializedClassTemplate<void*> { void f() {} };
670ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExplicitlySpecializedClassTemplate<void*>, f);
671ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?f@?$ExplicitlySpecializedClassTemplate@PAX@@QAEXXZ"
672ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @_ZN34ExplicitlySpecializedClassTemplateIPvE1fEv
673ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
674ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//===----------------------------------------------------------------------===//
675ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Classes with template base classes
676ef8225444452a1486bd721f3285301fe84643b00Stephen Hines//===----------------------------------------------------------------------===//
677ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
678ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ClassTemplate { void func() {} };
679ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct __declspec(dllexport) ExportedClassTemplate { void func() {} };
680ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct __declspec(dllimport) ImportedClassTemplate { void func() {} };
681ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
682ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ExplicitlySpecializedTemplate { void func() {} };
683ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <> struct ExplicitlySpecializedTemplate<int> { void func() {} };
684ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ExplicitlyExportSpecializedTemplate { void func() {} };
685ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <> struct __declspec(dllexport) ExplicitlyExportSpecializedTemplate<int> { void func() {} };
686ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ExplicitlyImportSpecializedTemplate { void func() {} };
687ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <> struct __declspec(dllimport) ExplicitlyImportSpecializedTemplate<int> { void func() {} };
688ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
689ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ExplicitlyInstantiatedTemplate { void func() {} };
690ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate struct ExplicitlyInstantiatedTemplate<int>;
691ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ExplicitlyExportInstantiatedTemplate { void func() {} };
692ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate struct __declspec(dllexport) ExplicitlyExportInstantiatedTemplate<int>;
693ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct ExplicitlyImportInstantiatedTemplate { void func() {} };
694ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate struct __declspec(dllimport) ExplicitlyImportInstantiatedTemplate<int>;
695ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
696ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
697ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MS: ClassTemplate<int> gets imported.
698ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromTemplate : public ClassTemplate<int> {};
699ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ClassTemplate<int>, func)
700ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?func@?$ClassTemplate@H@@QAEXXZ"
701ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ClassTemplateIiE4funcEv
702ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
703ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// ImportedTemplate is explicitly imported.
704ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromImportedTemplate : public ImportedClassTemplate<int> {};
705ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ImportedClassTemplate<int>, func)
706ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?func@?$ImportedClassTemplate@H@@QAEXXZ"
707ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: declare dllimport x86_thiscallcc void @_ZN21ImportedClassTemplateIiE4funcEv
708ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
709ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// ExportedTemplate is explicitly exported.
710ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromExportedTemplate : public ExportedClassTemplate<int> {};
711ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExportedClassTemplate<int>, func)
712ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?func@?$ExportedClassTemplate@H@@QAEXXZ"
713ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define weak_odr dllexport x86_thiscallcc void @_ZN21ExportedClassTemplateIiE4funcEv
714ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
715ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Base class already instantiated without attribute.
716ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct DerivedFromTemplateD : public ClassTemplate<double> {};
717ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromTemplateD2 : public ClassTemplate<double> {};
718ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ClassTemplate<double>, func)
719ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define linkonce_odr x86_thiscallcc void @"\01?func@?$ClassTemplate@N@@QAEXXZ"
720ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ClassTemplateIdE4funcEv
721ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
722ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MS: Base class already instantiated with dfferent attribute.
723ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllexport) DerivedFromTemplateB : public ClassTemplate<bool> {};
724ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromTemplateB2 : public ClassTemplate<bool> {};
725ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ClassTemplate<bool>, func)
726ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?func@?$ClassTemplate@_N@@QAEXXZ"
727ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN13ClassTemplateIbE4funcEv
728ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
729ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Base class already specialized without dll attribute.
730ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlySpecializedTemplate : public ExplicitlySpecializedTemplate<int> {};
731ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExplicitlySpecializedTemplate<int>, func)
732ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define linkonce_odr x86_thiscallcc void @"\01?func@?$ExplicitlySpecializedTemplate@H@@QAEXXZ"
733ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN29ExplicitlySpecializedTemplateIiE4funcEv
734ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
735ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Base class alredy specialized with export attribute.
736ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyExportSpecializedTemplate : public ExplicitlyExportSpecializedTemplate<int> {};
737ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExplicitlyExportSpecializedTemplate<int>, func)
738ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?func@?$ExplicitlyExportSpecializedTemplate@H@@QAEXXZ"
739ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define weak_odr dllexport x86_thiscallcc void @_ZN35ExplicitlyExportSpecializedTemplateIiE4funcEv
740ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
741ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Base class already specialized with import attribute.
742ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyImportSpecializedTemplate : public ExplicitlyImportSpecializedTemplate<int> {};
743ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExplicitlyImportSpecializedTemplate<int>, func)
744ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?func@?$ExplicitlyImportSpecializedTemplate@H@@QAEXXZ"
745ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @_ZN35ExplicitlyImportSpecializedTemplateIiE4funcEv
746ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
747ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Base class already instantiated without dll attribute.
748ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyInstantiatedTemplate : public ExplicitlyInstantiatedTemplate<int> {};
749ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExplicitlyInstantiatedTemplate<int>, func)
750ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define weak_odr x86_thiscallcc void @"\01?func@?$ExplicitlyInstantiatedTemplate@H@@QAEXXZ"
751ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define weak_odr x86_thiscallcc void @_ZN30ExplicitlyInstantiatedTemplateIiE4funcEv
752ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
753ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Base class already instantiated with export attribute.
754ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyExportInstantiatedTemplate : public ExplicitlyExportInstantiatedTemplate<int> {};
755ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExplicitlyExportInstantiatedTemplate<int>, func)
756ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01?func@?$ExplicitlyExportInstantiatedTemplate@H@@QAEXXZ"
757ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define weak_odr dllexport x86_thiscallcc void @_ZN36ExplicitlyExportInstantiatedTemplateIiE4funcEv
758ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
759ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Base class already instantiated with import attribute.
760ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) DerivedFromExplicitlyImportInstantiatedTemplate : public ExplicitlyImportInstantiatedTemplate<int> {};
761ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(ExplicitlyImportInstantiatedTemplate<int>, func)
762ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?func@?$ExplicitlyImportInstantiatedTemplate@H@@QAEXXZ"
763ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @_ZN36ExplicitlyImportInstantiatedTemplateIiE4funcEv
764ef8225444452a1486bd721f3285301fe84643b00Stephen Hines
765ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// MS: A dll attribute propagates through multiple levels of instantiation.
766ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct TopClass { void func() {} };
767ef8225444452a1486bd721f3285301fe84643b00Stephen Hinestemplate <typename T> struct MiddleClass : public TopClass<T> { };
768ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstruct __declspec(dllimport) BottomClas : public MiddleClass<int> { };
769ef8225444452a1486bd721f3285301fe84643b00Stephen HinesUSEMEMFUNC(TopClass<int>, func)
770ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// M32-DAG: {{declare|define available_externally}} dllimport x86_thiscallcc void @"\01?func@?$TopClass@H@@QAEXXZ"
771ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// G32-DAG: define linkonce_odr x86_thiscallcc void @_ZN8TopClassIiE4funcEv
772