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