mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
262 lines
4.2 KiB
D
262 lines
4.2 KiB
D
|
|
// EXTRA_CPP_SOURCES: cabi2.cpp
|
|
|
|
import core.stdc.stdio;
|
|
import core.stdc.config;
|
|
|
|
struct Foo1 { char c; }
|
|
struct Foo2 { short s; }
|
|
struct Foo3 { char c; short s; }
|
|
struct Foo4 { int i; }
|
|
struct Foo5 { int i, j; }
|
|
struct Foo6 { int i, j, k; }
|
|
struct S7 { float a, b; }
|
|
|
|
extern (C) Foo1 ctest1();
|
|
extern (C) Foo2 ctest2();
|
|
extern (C) Foo3 ctest3();
|
|
extern (C) Foo4 ctest4();
|
|
extern (C) Foo5 ctest5();
|
|
extern (C) Foo6 ctest6();
|
|
extern (C) S7 ctest10();
|
|
|
|
version(Windows)
|
|
version = Windows_or_32bit;
|
|
else version(X86)
|
|
version = Windows_or_32bit;
|
|
|
|
|
|
void test1()
|
|
{
|
|
Foo1 f1 = ctest1();
|
|
assert(f1.c == 3);
|
|
|
|
Foo2 f2 = ctest2();
|
|
assert(f2.s == 0x1234);
|
|
|
|
Foo3 f3 = ctest3();
|
|
assert(f3.s == 0x5678);
|
|
|
|
Foo4 f4 = ctest4();
|
|
assert(f4.i == 0x12345678);
|
|
|
|
Foo5 f5 = ctest5();
|
|
assert(f5.i == 0x12345678);
|
|
assert(f5.j == 0x21436587);
|
|
|
|
version(Windows_or_32bit)
|
|
{
|
|
Foo6 f6 = ctest6();
|
|
assert(f6.i == 0x12345678);
|
|
assert(f6.j == 0x21463587);
|
|
assert(f6.k == 0x24163857);
|
|
}
|
|
|
|
S7 s7 = ctest10();
|
|
assert(s7.a == 2.5);
|
|
assert(s7.b == 1.5);
|
|
}
|
|
|
|
/*******************************************/
|
|
|
|
extern (C)
|
|
{
|
|
char ctest7(char);
|
|
ubyte ctest8(ubyte);
|
|
byte ctest9(byte);
|
|
}
|
|
|
|
void test2()
|
|
{
|
|
assert(ctest7('a') == 'b');
|
|
assert(ctest8(7) == 8);
|
|
assert(ctest9(3) == 4);
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
extern (C)
|
|
{
|
|
void ctestrir(int x1, int x2, int x3, int x4, int x5, int x6, c_long_double a, int b, c_long_double c);
|
|
}
|
|
|
|
void test3()
|
|
{
|
|
ctestrir(1,2,3,4,5,6, c_long_double(100.0), 67, c_long_double(200.0));
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
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)
|
|
{
|
|
assert(a == 300.0);
|
|
assert(b == 68);
|
|
assert(c == 401.0);
|
|
}
|
|
|
|
extern (C) void test4();
|
|
|
|
/******************************************/
|
|
|
|
struct S11 { ubyte a, b, c; }
|
|
|
|
extern (C) S11 ctest11(ubyte x, S11, ubyte y);
|
|
|
|
void test11()
|
|
{
|
|
version (X86)
|
|
{
|
|
S11 t;
|
|
assert(S11.sizeof == 3);
|
|
t.a = 2;
|
|
t.b = 3;
|
|
t.c = 4;
|
|
auto s = ctest11(1, t, 5);
|
|
assert(s.a == 2);
|
|
assert(s.b == 3);
|
|
assert(s.c == 4);
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
struct S12 { char a,d; char b,e; ubyte c; }
|
|
|
|
extern (C) S12 ctest12(ubyte x, S12, ubyte y);
|
|
|
|
void test12()
|
|
{
|
|
version (X86)
|
|
{
|
|
S12 t;
|
|
printf("D sz = %d\n", cast(int)S12.sizeof);
|
|
// assert(S12.sizeof == 5);
|
|
t.a = 2;
|
|
t.b = 3;
|
|
t.c = 4;
|
|
auto s = ctest12(1, t, 5);
|
|
assert(s.a == 2);
|
|
assert(s.b == 3);
|
|
assert(s.c == 4);
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
struct S13 { ushort a, b, c; }
|
|
|
|
extern (C) S13 ctest13(ubyte x, S13, ubyte y);
|
|
|
|
void test13()
|
|
{
|
|
version (X86)
|
|
{
|
|
S13 t;
|
|
assert(S13.sizeof == 6);
|
|
t.a = 2;
|
|
t.b = 3;
|
|
t.c = 4;
|
|
auto s = ctest13(1, t, 5);
|
|
assert(s.a == 2);
|
|
assert(s.b == 3);
|
|
assert(s.c == 4);
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
struct S14 { char a,d,e,f; char b,g; ubyte c; }
|
|
|
|
extern (C) S14 ctest14(ubyte x, S14, ubyte y);
|
|
|
|
void test14()
|
|
{
|
|
version (X86)
|
|
{
|
|
S14 t;
|
|
assert(S14.sizeof == 7);
|
|
t.a = 2;
|
|
t.b = 3;
|
|
t.c = 4;
|
|
auto s = ctest14(1, t, 5);
|
|
assert(s.a == 2);
|
|
assert(s.b == 3);
|
|
assert(s.c == 4);
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
struct S15 { char a,d,e,f; char b,g,h,i; ubyte c; }
|
|
|
|
extern (C) S15 ctest15(ubyte x, S15, ubyte y);
|
|
|
|
void test15()
|
|
{
|
|
version (X86)
|
|
{
|
|
S15 t;
|
|
assert(S15.sizeof == 9);
|
|
t.a = 2;
|
|
t.b = 3;
|
|
t.c = 4;
|
|
auto s = ctest15(1, t, 5);
|
|
assert(s.a == 2);
|
|
assert(s.b == 3);
|
|
assert(s.c == 4);
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
// see https://issues.dlang.org/show_bug.cgi?id=17277
|
|
struct S16 {
|
|
char[5] a;
|
|
struct {
|
|
char b;
|
|
align(1) int c;
|
|
}
|
|
}
|
|
|
|
extern (C) S16 ctest16(ubyte x, S16, ubyte y);
|
|
|
|
void test16()
|
|
{
|
|
version (X86) // misaligned field
|
|
{
|
|
S16 t;
|
|
assert(S16.sizeof == 10);
|
|
assert(S16.alignof == 1);
|
|
t.a = "hello";
|
|
t.b = 3;
|
|
t.c = 0x11223344;
|
|
auto s = ctest16(1, t, 5);
|
|
assert(s.a == "hello");
|
|
assert(s.b == 3);
|
|
assert(s.c == 0x11223344);
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
int main()
|
|
{
|
|
test1();
|
|
test2();
|
|
test3();
|
|
version (Win64)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
test4();
|
|
}
|
|
test11();
|
|
test12();
|
|
test13();
|
|
test14();
|
|
test15();
|
|
test16();
|
|
|
|
return 0;
|
|
}
|