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