1// RUN: %clang_cc1 -triple i686-win32 -fsyntax-only -verify -std=c99 %s 2// RUN: %clang_cc1 -triple x86_64-win32 -fsyntax-only -verify -std=c11 %s 3// RUN: %clang_cc1 -triple i686-mingw32 -fsyntax-only -verify -std=c11 %s 4// RUN: %clang_cc1 -triple x86_64-mingw32 -fsyntax-only -verify -std=c99 %s 5 6// Invalid usage. 7__declspec(dllexport) typedef int typedef1; // expected-warning{{'dllexport' attribute only applies to variables and functions}} 8typedef __declspec(dllexport) int typedef2; // expected-warning{{'dllexport' attribute only applies to variables and functions}} 9typedef int __declspec(dllexport) typedef3; // expected-warning{{'dllexport' attribute only applies to variables and functions}} 10typedef __declspec(dllexport) void (*FunTy)(); // expected-warning{{'dllexport' attribute only applies to variables and functions}} 11enum __declspec(dllexport) Enum { EnumVal }; // expected-warning{{'dllexport' attribute only applies to variables and functions}} 12struct __declspec(dllexport) Record {}; // expected-warning{{'dllexport' attribute only applies to variables and functions}} 13 14 15 16//===----------------------------------------------------------------------===// 17// Globals 18//===----------------------------------------------------------------------===// 19 20// Export declaration. 21__declspec(dllexport) extern int ExternGlobalDecl; 22 23// dllexport implies a definition. 24__declspec(dllexport) int GlobalDef; 25 26// Export definition. 27__declspec(dllexport) int GlobalInit1 = 1; 28int __declspec(dllexport) GlobalInit2 = 1; 29 30// Declare, then export definition. 31__declspec(dllexport) extern int GlobalDeclInit; 32int GlobalDeclInit = 1; 33 34// Redeclarations 35__declspec(dllexport) extern int GlobalRedecl1; 36__declspec(dllexport) int GlobalRedecl1; 37 38__declspec(dllexport) extern int GlobalRedecl2; 39 int GlobalRedecl2; 40 41 extern int GlobalRedecl3; // expected-note{{previous declaration is here}} 42__declspec(dllexport) extern int GlobalRedecl3; // expected-error{{redeclaration of 'GlobalRedecl3' cannot add 'dllexport' attribute}} 43 44// External linkage is required. 45__declspec(dllexport) static int StaticGlobal; // expected-error{{'StaticGlobal' must have external linkage when declared 'dllexport'}} 46 47// Export in local scope. 48void functionScope() { 49 __declspec(dllexport) int LocalVarDecl; // expected-error{{'LocalVarDecl' must have external linkage when declared 'dllexport'}} 50 __declspec(dllexport) int LocalVarDef = 1; // expected-error{{'LocalVarDef' must have external linkage when declared 'dllexport'}} 51 __declspec(dllexport) extern int ExternLocalVarDecl; 52 __declspec(dllexport) static int StaticLocalVar; // expected-error{{'StaticLocalVar' must have external linkage when declared 'dllexport'}} 53} 54 55 56 57//===----------------------------------------------------------------------===// 58// Functions 59//===----------------------------------------------------------------------===// 60 61// Export function declaration. Check different placements. 62__attribute__((dllexport)) void decl1A(); // Sanity check with __attribute__ 63__declspec(dllexport) void decl1B(); 64 65void __attribute__((dllexport)) decl2A(); 66void __declspec(dllexport) decl2B(); 67 68// Export function definition. 69__declspec(dllexport) void def() {} 70 71// Export inline function. 72__declspec(dllexport) inline void inlineFunc1() {} 73extern void inlineFunc1(); 74 75inline void __attribute__((dllexport)) inlineFunc2() {} 76extern void inlineFunc2(); 77 78// Redeclarations 79__declspec(dllexport) void redecl1(); 80__declspec(dllexport) void redecl1(); 81 82__declspec(dllexport) void redecl2(); 83 void redecl2(); 84 85__declspec(dllexport) void redecl3(); 86 void redecl3() {} 87 88 void redecl4(); // expected-note{{previous declaration is here}} 89__declspec(dllexport) void redecl4(); // expected-error{{redeclaration of 'redecl4' cannot add 'dllexport' attribute}} 90 91 void redecl5(); // expected-note{{previous declaration is here}} 92__declspec(dllexport) inline void redecl5() {} // expected-error{{redeclaration of 'redecl5' cannot add 'dllexport' attribute}} 93 94// External linkage is required. 95__declspec(dllexport) static int staticFunc(); // expected-error{{'staticFunc' must have external linkage when declared 'dllexport'}} 96 97 98 99//===----------------------------------------------------------------------===// 100// Precedence 101//===----------------------------------------------------------------------===// 102 103// dllexport takes precedence over dllimport if both are specified. 104__attribute__((dllimport, dllexport)) extern int PrecedenceExternGlobal1A; // expected-warning{{'dllimport' attribute ignored}} 105__declspec(dllimport) __declspec(dllexport) extern int PrecedenceExternGlobal1B; // expected-warning{{'dllimport' attribute ignored}} 106 107__attribute__((dllexport, dllimport)) extern int PrecedenceExternGlobal2A; // expected-warning{{'dllimport' attribute ignored}} 108__declspec(dllexport) __declspec(dllimport) extern int PrecedenceExternGlobal2B; // expected-warning{{'dllimport' attribute ignored}} 109 110__attribute__((dllimport, dllexport)) int PrecedenceGlobal1A; // expected-warning{{'dllimport' attribute ignored}} 111__declspec(dllimport) __declspec(dllexport) int PrecedenceGlobal1B; // expected-warning{{'dllimport' attribute ignored}} 112 113__attribute__((dllexport, dllimport)) int PrecedenceGlobal2A; // expected-warning{{'dllimport' attribute ignored}} 114__declspec(dllexport) __declspec(dllimport) int PrecedenceGlobal2B; // expected-warning{{'dllimport' attribute ignored}} 115 116__declspec(dllexport) extern int PrecedenceExternGlobalRedecl1; 117__declspec(dllimport) extern int PrecedenceExternGlobalRedecl1; // expected-warning{{'dllimport' attribute ignored}} 118 119__declspec(dllimport) extern int PrecedenceExternGlobalRedecl2; // expected-warning{{'dllimport' attribute ignored}} 120__declspec(dllexport) extern int PrecedenceExternGlobalRedecl2; 121 122__declspec(dllexport) extern int PrecedenceGlobalRedecl1; 123__declspec(dllimport) int PrecedenceGlobalRedecl1; // expected-warning{{'dllimport' attribute ignored}} 124 125__declspec(dllimport) extern int PrecedenceGlobalRedecl2; // expected-warning{{'dllimport' attribute ignored}} 126__declspec(dllexport) int PrecedenceGlobalRedecl2; 127 128void __attribute__((dllimport, dllexport)) precedence1A() {} // expected-warning{{'dllimport' attribute ignored}} 129void __declspec(dllimport) __declspec(dllexport) precedence1B() {} // expected-warning{{'dllimport' attribute ignored}} 130 131void __attribute__((dllexport, dllimport)) precedence2A() {} // expected-warning{{'dllimport' attribute ignored}} 132void __declspec(dllexport) __declspec(dllimport) precedence2B() {} // expected-warning{{'dllimport' attribute ignored}} 133 134void __declspec(dllimport) precedenceRedecl1(); // expected-warning{{'dllimport' attribute ignored}} 135void __declspec(dllexport) precedenceRedecl1() {} 136 137void __declspec(dllexport) precedenceRedecl2(); 138void __declspec(dllimport) precedenceRedecl2() {} // expected-warning{{'dllimport' attribute ignored}} 139