1// RUN: %clang_cc1 -triple i686-windows-msvc   -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
2// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
3// RUN: %clang_cc1 -triple i686-windows-gnu    -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
4// RUN: %clang_cc1 -triple x86_64-windows-gnu  -emit-llvm -std=c11 -O0 -o - %s | FileCheck %s
5
6
7
8//===----------------------------------------------------------------------===//
9// Globals
10//===----------------------------------------------------------------------===//
11
12// Declarations are not exported.
13// CHECK-NOT: @ExternGlobalDecl
14__declspec(dllexport) extern int ExternGlobalDecl;
15
16// dllexport implies a definition.
17// CHECK-DAG: @GlobalDef = common dllexport global i32 0, align 4
18__declspec(dllexport) int GlobalDef;
19
20// Export definition.
21// CHECK-DAG: @GlobalInit = dllexport global i32 1, align 4
22__declspec(dllexport) int GlobalInit = 1;
23
24// Declare, then export definition.
25// CHECK-DAG: @GlobalDeclInit = dllexport global i32 1, align 4
26__declspec(dllexport) extern int GlobalDeclInit;
27int GlobalDeclInit = 1;
28
29// Redeclarations
30// CHECK-DAG: @GlobalRedecl1 = common dllexport global i32 0, align 4
31__declspec(dllexport) extern int GlobalRedecl1;
32__declspec(dllexport)        int GlobalRedecl1;
33
34// CHECK-DAG: @GlobalRedecl2 = common dllexport global i32 0, align 4
35__declspec(dllexport) extern int GlobalRedecl2;
36                             int GlobalRedecl2;
37
38
39
40//===----------------------------------------------------------------------===//
41// Functions
42//===----------------------------------------------------------------------===//
43
44// Declarations are not exported.
45
46// Export function definition.
47// CHECK-DAG: define dllexport void @def()
48__declspec(dllexport) void def(void) {}
49
50// Export inline function.
51// CHECK-DAG: define weak_odr dllexport void @inlineFunc()
52// CHECK-DAG: define weak_odr dllexport void @externInlineFunc()
53__declspec(dllexport) inline void inlineFunc(void) {}
54__declspec(dllexport) inline void externInlineFunc(void) {}
55extern void externInlineFunc(void);
56
57// Redeclarations
58// CHECK-DAG: define dllexport void @redecl1()
59__declspec(dllexport) void redecl1(void);
60__declspec(dllexport) void redecl1(void) {}
61
62// CHECK-DAG: define dllexport void @redecl2()
63__declspec(dllexport) void redecl2(void);
64                      void redecl2(void) {}
65
66
67
68//===----------------------------------------------------------------------===//
69// Precedence
70//===----------------------------------------------------------------------===//
71
72// dllexport takes precedence over the dllimport if both are specified.
73// CHECK-DAG: @PrecedenceGlobal1A = common dllexport global i32 0, align 4
74// CHECK-DAG: @PrecedenceGlobal1B = common dllexport global i32 0, align 4
75__attribute__((dllimport, dllexport))       int PrecedenceGlobal1A;
76__declspec(dllimport) __declspec(dllexport) int PrecedenceGlobal1B;
77
78// CHECK-DAG: @PrecedenceGlobal2A = common dllexport global i32 0, align 4
79// CHECK-DAG: @PrecedenceGlobal2B = common dllexport global i32 0, align 4
80__attribute__((dllexport, dllimport))       int PrecedenceGlobal2A;
81__declspec(dllexport) __declspec(dllimport) int PrecedenceGlobal2B;
82
83// CHECK-DAG: @PrecedenceGlobalRedecl1 = dllexport global i32 0, align 4
84__declspec(dllexport) extern int PrecedenceGlobalRedecl1;
85__declspec(dllimport)        int PrecedenceGlobalRedecl1 = 0;
86
87// CHECK-DAG: @PrecedenceGlobalRedecl2 = common dllexport global i32 0, align 4
88__declspec(dllimport) extern int PrecedenceGlobalRedecl2;
89__declspec(dllexport)        int PrecedenceGlobalRedecl2;
90
91// CHECK-DAG: @PrecedenceGlobalMixed1 = dllexport global i32 1, align 4
92__attribute__((dllexport)) extern int PrecedenceGlobalMixed1;
93__declspec(dllimport)             int PrecedenceGlobalMixed1 = 1;
94
95// CHECK-DAG: @PrecedenceGlobalMixed2 = common dllexport global i32 0, align 4
96__attribute__((dllimport)) extern int PrecedenceGlobalMixed2;
97__declspec(dllexport)             int PrecedenceGlobalMixed2;
98
99// CHECK-DAG: define dllexport void @precedence1A()
100// CHECK-DAG: define dllexport void @precedence1B()
101void __attribute__((dllimport, dllexport))       precedence1A(void) {}
102void __declspec(dllimport) __declspec(dllexport) precedence1B(void) {}
103
104// CHECK-DAG: define dllexport void @precedence2A()
105// CHECK-DAG: define dllexport void @precedence2B()
106void __attribute__((dllexport, dllimport))       precedence2A(void) {}
107void __declspec(dllexport) __declspec(dllimport) precedence2B(void) {}
108
109// CHECK-DAG: define dllexport void @precedenceRedecl1()
110void __declspec(dllimport) precedenceRedecl1(void);
111void __declspec(dllexport) precedenceRedecl1(void) {}
112
113// CHECK-DAG: define dllexport void @precedenceRedecl2()
114void __declspec(dllexport) precedenceRedecl2(void);
115void __declspec(dllimport) precedenceRedecl2(void) {}
116