1
2 // EXTRA_CPP_SOURCES: cabi2.cpp
3
4 import core.stdc.stdio;
5 import core.stdc.config;
6
7 struct Foo1 { char c; }
8 struct Foo2 { short s; }
9 struct Foo3 { char c; short s; }
10 struct Foo4 { int i; }
11 struct Foo5 { int i, j; }
12 struct Foo6 { int i, j, k; }
13 struct S7 { float a, b; }
14
15 extern (C) Foo1 ctest1();
16 extern (C) Foo2 ctest2();
17 extern (C) Foo3 ctest3();
18 extern (C) Foo4 ctest4();
19 extern (C) Foo5 ctest5();
20 extern (C) Foo6 ctest6();
21 extern (C) S7 ctest10();
22
23 version(Windows)
24 version = Windows_or_32bit;
25 else version(X86)
26 version = Windows_or_32bit;
27
28
test1()29 void test1()
30 {
31 Foo1 f1 = ctest1();
32 assert(f1.c == 3);
33
34 Foo2 f2 = ctest2();
35 assert(f2.s == 0x1234);
36
37 Foo3 f3 = ctest3();
38 assert(f3.s == 0x5678);
39
40 Foo4 f4 = ctest4();
41 assert(f4.i == 0x12345678);
42
43 Foo5 f5 = ctest5();
44 assert(f5.i == 0x12345678);
45 assert(f5.j == 0x21436587);
46
47 version(Windows_or_32bit)
48 {
49 Foo6 f6 = ctest6();
50 assert(f6.i == 0x12345678);
51 assert(f6.j == 0x21463587);
52 assert(f6.k == 0x24163857);
53 }
54
55 S7 s7 = ctest10();
56 assert(s7.a == 2.5);
57 assert(s7.b == 1.5);
58 }
59
60 /*******************************************/
61
62 extern (C)
63 {
64 char ctest7(char);
65 ubyte ctest8(ubyte);
66 byte ctest9(byte);
67 }
68
test2()69 void test2()
70 {
71 assert(ctest7('a') == 'b');
72 assert(ctest8(7) == 8);
73 assert(ctest9(3) == 4);
74 }
75
76 /******************************************/
77
78 extern (C)
79 {
80 void ctestrir(int x1, int x2, int x3, int x4, int x5, int x6, c_long_double a, int b, c_long_double c);
81 }
82
test3()83 void test3()
84 {
85 ctestrir(1,2,3,4,5,6, c_long_double(100.0), 67, c_long_double(200.0));
86 }
87
88 /******************************************/
89
dtestrir(int x1,int x2,int x3,int x4,int x5,int x6,c_long_double a,int b,c_long_double c)90 extern (C) void dtestrir(int x1, int x2, int x3, int x4, int x5, int x6, c_long_double a, int b, c_long_double c)
91 {
92 assert(a == 300.0);
93 assert(b == 68);
94 assert(c == 401.0);
95 }
96
97 extern (C) void test4();
98
99 /******************************************/
100
101 struct S11 { ubyte a, b, c; }
102
103 extern (C) S11 ctest11(ubyte x, S11, ubyte y);
104
test11()105 void test11()
106 {
107 version (X86)
108 {
109 S11 t;
110 assert(S11.sizeof == 3);
111 t.a = 2;
112 t.b = 3;
113 t.c = 4;
114 auto s = ctest11(1, t, 5);
115 assert(s.a == 2);
116 assert(s.b == 3);
117 assert(s.c == 4);
118 }
119 }
120
121 /******************************************/
122
123 struct S12 { char a,d; char b,e; ubyte c; }
124
125 extern (C) S12 ctest12(ubyte x, S12, ubyte y);
126
test12()127 void test12()
128 {
129 version (X86)
130 {
131 S12 t;
132 printf("D sz = %d\n", cast(int)S12.sizeof);
133 // assert(S12.sizeof == 5);
134 t.a = 2;
135 t.b = 3;
136 t.c = 4;
137 auto s = ctest12(1, t, 5);
138 assert(s.a == 2);
139 assert(s.b == 3);
140 assert(s.c == 4);
141 }
142 }
143
144 /******************************************/
145
146 struct S13 { ushort a, b, c; }
147
148 extern (C) S13 ctest13(ubyte x, S13, ubyte y);
149
test13()150 void test13()
151 {
152 version (X86)
153 {
154 S13 t;
155 assert(S13.sizeof == 6);
156 t.a = 2;
157 t.b = 3;
158 t.c = 4;
159 auto s = ctest13(1, t, 5);
160 assert(s.a == 2);
161 assert(s.b == 3);
162 assert(s.c == 4);
163 }
164 }
165
166 /******************************************/
167
168 struct S14 { char a,d,e,f; char b,g; ubyte c; }
169
170 extern (C) S14 ctest14(ubyte x, S14, ubyte y);
171
test14()172 void test14()
173 {
174 version (X86)
175 {
176 S14 t;
177 assert(S14.sizeof == 7);
178 t.a = 2;
179 t.b = 3;
180 t.c = 4;
181 auto s = ctest14(1, t, 5);
182 assert(s.a == 2);
183 assert(s.b == 3);
184 assert(s.c == 4);
185 }
186 }
187
188 /******************************************/
189
190 struct S15 { char a,d,e,f; char b,g,h,i; ubyte c; }
191
192 extern (C) S15 ctest15(ubyte x, S15, ubyte y);
193
test15()194 void test15()
195 {
196 version (X86)
197 {
198 S15 t;
199 assert(S15.sizeof == 9);
200 t.a = 2;
201 t.b = 3;
202 t.c = 4;
203 auto s = ctest15(1, t, 5);
204 assert(s.a == 2);
205 assert(s.b == 3);
206 assert(s.c == 4);
207 }
208 }
209
210 /******************************************/
211
212 // see https://issues.dlang.org/show_bug.cgi?id=17277
213 struct S16 {
214 char[5] a;
215 struct {
216 char b;
217 align(1) int c;
218 }
219 }
220
221 extern (C) S16 ctest16(ubyte x, S16, ubyte y);
222
223 void test16()
224 {
225 version (X86) // misaligned field
226 {
227 S16 t;
228 assert(S16.sizeof == 10);
229 assert(S16.alignof == 1);
230 t.a = "hello";
231 t.b = 3;
232 t.c = 0x11223344;
233 auto s = ctest16(1, t, 5);
234 assert(s.a == "hello");
235 assert(s.b == 3);
236 assert(s.c == 0x11223344);
237 }
238 }
239
240 /******************************************/
241
242 int main()
243 {
244 test1();
245 test2();
246 test3();
247 version (Win64)
248 {
249 }
250 else
251 {
252 test4();
253 }
254 test11();
255 test12();
256 test13();
257 test14();
258 test15();
259 test16();
260
261 return 0;
262 }
263