blob: 615f8f77b4128737513dc2b8fa3dba20afbd8f6b [file] [log] [blame]
Nico Rieck60478662014-02-22 19:47:30 +00001// 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(dllimport) typedef int typedef1; // expected-warning{{'dllimport' attribute only applies to variables and functions}}
8typedef __declspec(dllimport) int typedef2; // expected-warning{{'dllimport' attribute only applies to variables and functions}}
9typedef int __declspec(dllimport) typedef3; // expected-warning{{'dllimport' attribute only applies to variables and functions}}
10typedef __declspec(dllimport) void (*FunTy)(); // expected-warning{{'dllimport' attribute only applies to variables and functions}}
11enum __declspec(dllimport) Enum { EnumVal }; // expected-warning{{'dllimport' attribute only applies to variables and functions}}
12struct __declspec(dllimport) Record {}; // expected-warning{{'dllimport' attribute only applies to variables and functions}}
13
14
15
16//===----------------------------------------------------------------------===//
17// Globals
18//===----------------------------------------------------------------------===//
19
20// Import declaration.
21__declspec(dllimport) extern int ExternGlobalDecl;
22
Nico Rieck8e9791f2014-02-26 21:27:13 +000023// dllimport implies a declaration.
24__declspec(dllimport) int GlobalDecl;
Nico Rieck60478662014-02-22 19:47:30 +000025
26// Not allowed on definitions.
Nico Rieck8e9791f2014-02-26 21:27:13 +000027__declspec(dllimport) extern int ExternGlobalInit = 1; // expected-error{{definition of dllimport data}}
28__declspec(dllimport) int GlobalInit1 = 1; // expected-error{{definition of dllimport data}}
29int __declspec(dllimport) GlobalInit2 = 1; // expected-error{{definition of dllimport data}}
Nico Rieck60478662014-02-22 19:47:30 +000030
31// Declare, then reject definition.
32__declspec(dllimport) extern int ExternGlobalDeclInit;
Nico Rieck8e9791f2014-02-26 21:27:13 +000033int ExternGlobalDeclInit = 1; // expected-error{{definition of dllimport data}}
Nico Rieck60478662014-02-22 19:47:30 +000034
35// Redeclarations
36__declspec(dllimport) extern int GlobalRedecl1;
37__declspec(dllimport) extern int GlobalRedecl1;
38
39// Import in local scope.
40void functionScope() {
Nico Rieck8e9791f2014-02-26 21:27:13 +000041 __declspec(dllimport) int LocalVarDecl;
42 __declspec(dllimport) int LocalVarDef = 1; // expected-error{{definition of dllimport data}}
Nico Rieck60478662014-02-22 19:47:30 +000043 __declspec(dllimport) extern int ExternLocalVarDecl;
Nico Rieck8e9791f2014-02-26 21:27:13 +000044 __declspec(dllimport) extern int ExternLocalVarDef = 1; // expected-error{{definition of dllimport data}}
Nico Rieck60478662014-02-22 19:47:30 +000045}
46
47
48
49//===----------------------------------------------------------------------===//
50// Functions
51//===----------------------------------------------------------------------===//
52
53// Import function declaration. Check different placements.
54__attribute__((dllimport)) void decl1A(); // Sanity check with __attribute__
55__declspec(dllimport) void decl1B();
56
57void __attribute__((dllimport)) decl2A();
58void __declspec(dllimport) decl2B();
59
60// Not allowed on function definitions.
61__declspec(dllimport) void def() {} // expected-error{{'dllimport' attribute can be applied only to symbol declaration}}
62
63// Import inline function.
64__declspec(dllimport) inline void inlineFunc1() {} // expected-warning{{'dllimport' attribute ignored}}
65inline void __attribute__((dllimport)) inlineFunc2() {} // expected-warning{{'dllimport' attribute ignored}}
66
67// Redeclarations
68__declspec(dllimport) void redecl1();
69__declspec(dllimport) void redecl1();
70
71__declspec(dllimport) void redecl3();
72 void redecl3() {} // expected-warning{{'redecl3' redeclared without 'dllimport' attribute: previous 'dllimport' ignored}}