1651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -triple i686-win32 -fsyntax-only -verify -std=c99 %s 2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -triple x86_64-win32 -fsyntax-only -verify -std=c11 %s 3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -triple i686-mingw32 -fsyntax-only -verify -std=c11 %s 4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN: %clang_cc1 -triple x86_64-mingw32 -fsyntax-only -verify -std=c99 %s 5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Invalid usage. 7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) typedef int typedef1; // expected-warning{{'dllimport' attribute only applies to variables and functions}} 8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef __declspec(dllimport) int typedef2; // expected-warning{{'dllimport' attribute only applies to variables and functions}} 9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef int __declspec(dllimport) typedef3; // expected-warning{{'dllimport' attribute only applies to variables and functions}} 10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestypedef __declspec(dllimport) void (*FunTy)(); // expected-warning{{'dllimport' attribute only applies to variables and functions}} 11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesenum __declspec(dllimport) Enum { EnumVal }; // expected-warning{{'dllimport' attribute only applies to variables and functions}} 12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct __declspec(dllimport) Record {}; // expected-warning{{'dllimport' attribute only applies to variables and functions}} 13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Globals 18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Import declaration. 21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) extern int ExternGlobalDecl; 22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// dllimport implies a declaration. 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) int GlobalDecl; 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint **__attribute__((dllimport))* GlobalDeclChunkAttr; 26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint GlobalDeclAttr __attribute__((dllimport)); 27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 28ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Address of variables can't be used for initialization in C language modes. 29ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesint *VarForInit = &GlobalDecl; // expected-error{{initializer element is not a compile-time constant}} 30ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Not allowed on definitions. 32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) extern int ExternGlobalInit = 1; // expected-error{{definition of dllimport data}} 33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) int GlobalInit1 = 1; // expected-error{{definition of dllimport data}} 34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint __declspec(dllimport) GlobalInit2 = 1; // expected-error{{definition of dllimport data}} 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Declare, then reject definition. 37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) extern int ExternGlobalDeclInit; // expected-note{{previous declaration is here}} expected-note{{previous attribute is here}} 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint ExternGlobalDeclInit = 1; // expected-warning{{'ExternGlobalDeclInit' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}} 39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) int GlobalDeclInit; // expected-note{{previous declaration is here}} expected-note{{previous attribute is here}} 41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint GlobalDeclInit = 1; // expected-warning{{'GlobalDeclInit' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}} 42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint *__attribute__((dllimport)) GlobalDeclChunkAttrInit; // expected-note{{previous declaration is here}} expected-note{{previous attribute is here}} 44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint *GlobalDeclChunkAttrInit = 0; // expected-warning{{'GlobalDeclChunkAttrInit' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}} 45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint GlobalDeclAttrInit __attribute__((dllimport)); // expected-note{{previous declaration is here}} expected-note{{previous attribute is here}} 47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint GlobalDeclAttrInit = 1; // expected-warning{{'GlobalDeclAttrInit' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}} 48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Redeclarations 50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) extern int GlobalRedecl1; 51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) extern int GlobalRedecl1; 52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) int GlobalRedecl2a; 54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) int GlobalRedecl2a; 55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint *__attribute__((dllimport)) GlobalRedecl2b; 57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint *__attribute__((dllimport)) GlobalRedecl2b; 58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint GlobalRedecl2c __attribute__((dllimport)); 60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint GlobalRedecl2c __attribute__((dllimport)); 61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// NB: MSVC issues a warning and makes GlobalRedecl3 dllexport. We follow GCC 63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// and drop the dllimport with a warning. 64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) extern int GlobalRedecl3; // expected-note{{previous declaration is here}} expected-note{{previous attribute is here}} 65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern int GlobalRedecl3; // expected-warning{{'GlobalRedecl3' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}} 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines extern int GlobalRedecl4; // expected-note{{previous declaration is here}} 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) extern int GlobalRedecl4; // expected-error{{redeclaration of 'GlobalRedecl4' cannot add 'dllimport' attribute}} 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// External linkage is required. 71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) static int StaticGlobal; // expected-error{{'StaticGlobal' must have external linkage when declared 'dllimport'}} 72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Import in local scope. 74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) float LocalRedecl1; // expected-note{{previous definition is here}} 75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) float LocalRedecl2; // expected-note{{previous definition is here}} 76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) float LocalRedecl3; // expected-note{{previous definition is here}} 77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid functionScope() { 78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines __declspec(dllimport) int LocalRedecl1; // expected-error{{redefinition of 'LocalRedecl1' with a different type: 'int' vs 'float'}} 79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int *__attribute__((dllimport)) LocalRedecl2; // expected-error{{redefinition of 'LocalRedecl2' with a different type: 'int *' vs 'float'}} 80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines int LocalRedecl3 __attribute__((dllimport)); // expected-error{{redefinition of 'LocalRedecl3' with a different type: 'int' vs 'float'}} 81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines __declspec(dllimport) int LocalVarDecl; 83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines __declspec(dllimport) int LocalVarDef = 1; // expected-error{{definition of dllimport data}} 84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines __declspec(dllimport) extern int ExternLocalVarDecl; 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines __declspec(dllimport) extern int ExternLocalVarDef = 1; // expected-error{{definition of dllimport data}} 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines __declspec(dllimport) static int StaticLocalVar; // expected-error{{'StaticLocalVar' must have external linkage when declared 'dllimport'}} 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Functions 93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines//===----------------------------------------------------------------------===// 94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Import function declaration. Check different placements. 96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__attribute__((dllimport)) void decl1A(); // Sanity check with __attribute__ 97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) void decl1B(); 98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid __attribute__((dllimport)) decl2A(); 100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid __declspec(dllimport) decl2B(); 101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 102ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// Address of functions can be used for initialization in C language modes. 103ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// However, the address of the thunk wrapping the function is used instead of 104ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// the address in the import address table. 105ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid (*FunForInit)() = &decl2A; 106ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Not allowed on function definitions. 1086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void def() {} // expected-error{{dllimport cannot be applied to non-inline function definition}} 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Import inline function. 1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) inline void inlineFunc1() {} 1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesinline void __attribute__((dllimport)) inlineFunc2() {} 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Redeclarations 115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) void redecl1(); 116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) void redecl1(); 117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// NB: MSVC issues a warning and makes redecl2/redecl3 dllexport. We follow GCC 119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// and drop the dllimport with a warning. 120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) void redecl2(); // expected-note{{previous declaration is here}} expected-note{{previous attribute is here}} 121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void redecl2(); // expected-warning{{'redecl2' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}} 122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) void redecl3(); // expected-note{{previous declaration is here}} expected-note{{previous attribute is here}} 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void redecl3() {} // expected-warning{{'redecl3' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}} 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void redecl4(); // expected-note{{previous declaration is here}} 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) void redecl4(); // expected-error{{redeclaration of 'redecl4' cannot add 'dllimport' attribute}} 128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// Inline redeclarations are fine. 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) void redecl5(); 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines inline void redecl5() {} 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void redecl6(); // expected-note{{previous declaration is here}} 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines__declspec(dllimport) inline void redecl6() {} // expected-error{{redeclaration of 'redecl6' cannot add 'dllimport' attribute}} 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// External linkage is required. 137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines__declspec(dllimport) static int staticFunc(); // expected-error{{'staticFunc' must have external linkage when declared 'dllimport'}} 138