dmd/compiler/test/runnable_cxx/extra-files/cabi2.cpp
2022-07-09 18:53:07 +02:00

254 lines
4.1 KiB
C++

#include <assert.h>
#include <stdio.h>
#include <stdint.h>
#if __cplusplus
extern "C" {
#endif
struct Foo1 { char c; };
struct Foo1 ctest1()
{
struct Foo1 f;
f.c = 3;
return f;
}
struct Foo2 { short s; };
struct Foo2 ctest2()
{
struct Foo2 f;
f.s = 0x1234;
return f;
}
struct Foo3 { char c; short s; };
struct Foo3 ctest3()
{
struct Foo3 f;
f.s = 0x5678;
return f;
}
struct Foo4 { int i; };
struct Foo4 ctest4()
{
struct Foo4 f;
f.i = 0x12345678;
return f;
}
struct Foo5 { int i, j; };
struct Foo5 ctest5()
{
struct Foo5 f;
f.i = 0x12345678;
f.j = 0x21436587;
return f;
}
struct Foo6 { int i, j, k; };
struct Foo6 ctest6()
{
struct Foo6 f;
f.i = 0x12345678;
f.j = 0x21463587;
f.k = 0x24163857;
return f;
}
struct S7 { float a,b; };
struct S7 ctest10()
{
struct S7 f;
f.a = 2.5;
f.b = 1.5;
return f;
}
// =================================
char ctest7(char c)
{
return c + 1;
}
unsigned char ctest8(unsigned char c)
{
return c + 1;
}
signed char ctest9(signed char c)
{
return c + 1;
}
/***********************************************/
void ctestrir(int x1, int x2, int x3, int x4, int x5, int x6, long double a, int b, long double c)
{
assert(a == 100.0);
assert(b == 67);
assert(c == 200.0);
}
/***********************************************/
extern void dtestrir(int x1, int x2, int x3, int x4, int x5, int x6, long double a, int b, long double c);
void test4()
{
dtestrir(1,2,3,4,5,6, 300.0, 68, 401.0);
}
/**********************************************/
typedef struct S11 {
char a;
char b;
char c;
} S11;
S11 ctest11(char x, S11 s, char y) {
printf("C sz = %d\n", (int)sizeof(S11));
assert(sizeof(S11) == 3);
printf("x = %d\n", (int)x);
printf("s.a = %d\n", (int)s.a);
printf("s.b = %d\n", (int)s.b);
printf("s.c = %d\n", (int)s.c);
printf("y = %d\n", (int)y);
return s;
}
/**********************************************/
typedef struct S12 {
char a,d;
char b,e;
char c;
} S12;
S12 ctest12(char x, S12 s, char y) {
printf("C sz = %d\n", (int)sizeof(S12));
assert(sizeof(S12) == 5);
printf("x = %d\n", (int)x);
printf("s.a = %d\n", (int)s.a);
printf("s.b = %d\n", (int)s.b);
printf("s.c = %d\n", (int)s.c);
printf("y = %d\n", (int)y);
return s;
}
/**********************************************/
typedef struct S13 {
short a;
short b;
short c;
} S13;
S13 ctest13(char x, S13 s, char y) {
printf("C sz = %d\n", (int)sizeof(S13));
assert(sizeof(S13) == 6);
printf("x = %d\n", (int)x);
printf("s.a = %d\n", (int)s.a);
printf("s.b = %d\n", (int)s.b);
printf("s.c = %d\n", (int)s.c);
printf("y = %d\n", (int)y);
return s;
}
/**********************************************/
typedef struct S14 {
char a,d,e,f;
char b,g;
char c;
} S14;
S14 ctest14(char x, S14 s, char y) {
printf("C sz = %d\n", (int)sizeof(S14));
assert(sizeof(S14) == 7);
printf("x = %d\n", (int)x);
printf("s.a = %d\n", (int)s.a);
printf("s.b = %d\n", (int)s.b);
printf("s.c = %d\n", (int)s.c);
printf("y = %d\n", (int)y);
return s;
}
/**********************************************/
typedef struct S15 {
char a,d,e,f;
char b,g,h,i;
char c;
} S15;
S15 ctest15(char x, S15 s, char y) {
printf("C sz = %d\n", (int)sizeof(S15));
assert(sizeof(S15) == 9);
printf("x = %d\n", (int)x);
printf("s.a = %d\n", (int)s.a);
printf("s.b = %d\n", (int)s.b);
printf("s.c = %d\n", (int)s.c);
printf("y = %d\n", (int)y);
return s;
}
/**********************************************/
typedef struct S16 {
char a[5];
#ifdef __GNUC__
struct __attribute__((packed))
#else
#pragma pack(push, 1)
struct
#endif
{
char b;
int c;
};
#ifndef __GNUC__
#pragma pack(pop)
#endif
} S16;
S16 ctest16(char x, S16 s, char y) {
printf("C sz = %d\n", (int)sizeof(S16));
assert(sizeof(S16) == 10);
printf("x = %d\n", (int)x);
printf("s.a = %.*s\n", 5, s.a);
printf("s.b = %d\n", (int)s.b);
printf("s.c = %d\n", s.c);
printf("y = %d\n", (int)y);
return s;
}
#if __cplusplus
}
#endif