dllimport.cpp revision ef8225444452a1486bd721f3285301fe84643b00
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