dmd/compiler/test/runnable/initializer.c

883 lines
18 KiB
C

/* Test initializers */
int printf(const char *s, ...);
void exit(int);
void assert(int b, int line)
{
if (!b)
{
printf("failed test at line %d\n", line);
exit(1);
}
}
/*******************************************/
void test1()
{
static int a1[] = { 1, 2, [0] = 3 };
assert(a1[0] == 3, __LINE__);
assert(a1[1] == 2, __LINE__);
assert(sizeof(a1) == 8, __LINE__);
}
/*******************************************/
int a2[2][3] = { 1,2,[1]={3} };
void test2()
{
assert(a2[0][0] == 1, __LINE__);
assert(a2[0][1] == 2, __LINE__);
assert(a2[0][2] == 0, __LINE__);
assert(a2[1][0] == 3, __LINE__);
assert(a2[1][1] == 0, __LINE__);
assert(a2[1][2] == 0, __LINE__);
}
/*******************************************/
int a3[2][3] = { 1,2,3,[1]=4 };
void test3()
{
assert(a3[0][0] == 1, __LINE__);
assert(a3[0][1] == 2, __LINE__);
assert(a3[0][2] == 3, __LINE__);
assert(a3[1][0] == 4, __LINE__);
assert(a3[1][1] == 0, __LINE__);
assert(a3[1][2] == 0, __LINE__);
}
/*******************************************/
typedef struct S { int a, b; } S;
S a4[2] = { 3, 4, 5, 6 };
void test4()
{
assert(a4[0].a == 3, __LINE__);
assert(a4[0].b == 4, __LINE__);
assert(a4[1].a == 5, __LINE__);
assert(a4[1].b == 6, __LINE__);
}
/*******************************************/
int y5[4][3] = {
{1,3,5},
{2,4,6},
{3,5,7},
};
void test5()
{
assert(y5[0][0] == 1, __LINE__);
assert(y5[0][1] == 3, __LINE__);
assert(y5[0][2] == 5, __LINE__);
assert(y5[1][0] == 2, __LINE__);
assert(y5[1][1] == 4, __LINE__);
assert(y5[1][2] == 6, __LINE__);
assert(y5[2][0] == 3, __LINE__);
assert(y5[2][1] == 5, __LINE__);
assert(y5[2][2] == 7, __LINE__);
assert(y5[3][0] == 0, __LINE__);
assert(y5[3][1] == 0, __LINE__);
assert(y5[3][2] == 0, __LINE__);
}
/*******************************************/
int y6[4][3] = {
1,3,5,
2,4,6,
3,5,7
};
void test6()
{
assert(y6[0][0] == 1, __LINE__);
assert(y6[0][1] == 3, __LINE__);
assert(y6[0][2] == 5, __LINE__);
assert(y6[1][0] == 2, __LINE__);
assert(y6[1][1] == 4, __LINE__);
assert(y6[1][2] == 6, __LINE__);
assert(y6[2][0] == 3, __LINE__);
assert(y6[2][1] == 5, __LINE__);
assert(y6[2][2] == 7, __LINE__);
assert(y6[3][0] == 0, __LINE__);
assert(y6[3][1] == 0, __LINE__);
assert(y6[3][2] == 0, __LINE__);
}
/*******************************************/
int y7[4][3] = {
{1},{2},{3},{4}
};
void test7()
{
assert(y7[0][0] == 1, __LINE__);
assert(y7[0][1] == 0, __LINE__);
assert(y7[0][2] == 0, __LINE__);
assert(y7[1][0] == 2, __LINE__);
assert(y7[1][1] == 0, __LINE__);
assert(y7[1][2] == 0, __LINE__);
assert(y7[2][0] == 3, __LINE__);
assert(y7[2][1] == 0, __LINE__);
assert(y7[2][2] == 0, __LINE__);
assert(y7[3][0] == 4, __LINE__);
assert(y7[3][1] == 0, __LINE__);
assert(y7[3][2] == 0, __LINE__);
}
/*******************************************/
int q8[4][3][2] = {
{1},
{2,3},
{4,5,6}
};
void test8()
{
assert(q8[0][0][0] == 1, __LINE__);
assert(q8[0][0][1] == 0, __LINE__);
assert(q8[0][1][0] == 0, __LINE__);
assert(q8[0][1][1] == 0, __LINE__);
assert(q8[0][2][0] == 0, __LINE__);
assert(q8[0][2][1] == 0, __LINE__);
assert(q8[1][0][0] == 2, __LINE__);
assert(q8[1][0][1] == 3, __LINE__);
assert(q8[1][1][0] == 0, __LINE__);
assert(q8[1][1][1] == 0, __LINE__);
assert(q8[1][2][0] == 0, __LINE__);
assert(q8[1][2][1] == 0, __LINE__);
assert(q8[2][0][0] == 4, __LINE__);
assert(q8[2][0][1] == 5, __LINE__);
assert(q8[2][1][0] == 6, __LINE__);
assert(q8[2][1][1] == 0, __LINE__);
assert(q8[2][2][0] == 0, __LINE__);
assert(q8[2][2][1] == 0, __LINE__);
assert(q8[3][0][0] == 0, __LINE__);
assert(q8[3][0][1] == 0, __LINE__);
assert(q8[3][1][0] == 0, __LINE__);
assert(q8[3][1][1] == 0, __LINE__);
assert(q8[3][2][0] == 0, __LINE__);
assert(q8[3][2][1] == 0, __LINE__);
}
/*******************************************/
int q9[4][3][2] = {
1, 0, 0, 0, 0, 0,
2, 3, 0, 0, 0, 0,
4, 5, 6
};
void test9()
{
assert(q9[0][0][0] == 1, __LINE__);
assert(q9[0][0][1] == 0, __LINE__);
assert(q9[0][1][0] == 0, __LINE__);
assert(q9[0][1][1] == 0, __LINE__);
assert(q9[0][2][0] == 0, __LINE__);
assert(q9[0][2][1] == 0, __LINE__);
assert(q9[1][0][0] == 2, __LINE__);
assert(q9[1][0][1] == 3, __LINE__);
assert(q9[1][1][0] == 0, __LINE__);
assert(q9[1][1][1] == 0, __LINE__);
assert(q9[1][2][0] == 0, __LINE__);
assert(q9[1][2][1] == 0, __LINE__);
assert(q9[2][0][0] == 4, __LINE__);
assert(q9[2][0][1] == 5, __LINE__);
assert(q9[2][1][0] == 6, __LINE__);
assert(q9[2][1][1] == 0, __LINE__);
assert(q9[2][2][0] == 0, __LINE__);
assert(q9[2][2][1] == 0, __LINE__);
assert(q9[3][0][0] == 0, __LINE__);
assert(q9[3][0][1] == 0, __LINE__);
assert(q9[3][1][0] == 0, __LINE__);
assert(q9[3][1][1] == 0, __LINE__);
assert(q9[3][2][0] == 0, __LINE__);
assert(q9[3][2][1] == 0, __LINE__);
}
/*******************************************/
int q10[4][3][2] = {
{
{ 1 },
},
{
{ 2, 3 },
},
{
{ 4, 5 },
{ 6 },
}
};
void test10()
{
assert(q10[0][0][0] == 1, __LINE__);
assert(q10[0][0][1] == 0, __LINE__);
assert(q10[0][1][0] == 0, __LINE__);
assert(q10[0][1][1] == 0, __LINE__);
assert(q10[0][2][0] == 0, __LINE__);
assert(q10[0][2][1] == 0, __LINE__);
assert(q10[1][0][0] == 2, __LINE__);
assert(q10[1][0][1] == 3, __LINE__);
assert(q10[1][1][0] == 0, __LINE__);
assert(q10[1][1][1] == 0, __LINE__);
assert(q10[1][2][0] == 0, __LINE__);
assert(q10[1][2][1] == 0, __LINE__);
assert(q10[2][0][0] == 4, __LINE__);
assert(q10[2][0][1] == 5, __LINE__);
assert(q10[2][1][0] == 6, __LINE__);
assert(q10[2][1][1] == 0, __LINE__);
assert(q10[2][2][0] == 0, __LINE__);
assert(q10[2][2][1] == 0, __LINE__);
assert(q10[3][0][0] == 0, __LINE__);
assert(q10[3][0][1] == 0, __LINE__);
assert(q10[3][1][0] == 0, __LINE__);
assert(q10[3][1][1] == 0, __LINE__);
assert(q10[3][2][0] == 0, __LINE__);
assert(q10[3][2][1] == 0, __LINE__);
}
/*******************************************/
typedef int A[];
A a = { 1, 2 }, b = { 3, 4, 5 };
_Static_assert(sizeof(a) == 8, "1");
_Static_assert(sizeof(b) == 12, "2");
/*******************************************/
int a11[10] = {
1,2,3, [6] = 4,5,6
};
void test11()
{
assert(a11[0] == 1, __LINE__);
assert(a11[1] == 2, __LINE__);
assert(a11[2] == 3, __LINE__);
assert(a11[3] == 0, __LINE__);
assert(a11[4] == 0, __LINE__);
assert(a11[5] == 0, __LINE__);
assert(a11[6] == 4, __LINE__);
assert(a11[7] == 5, __LINE__);
assert(a11[8] == 6, __LINE__);
assert(a11[9] == 0, __LINE__);
}
/*******************************************/
char s12[] = "hello";
void test12()
{
assert(sizeof(s12) == 6, __LINE__);
assert(s12[4] == 'o', __LINE__);
assert(s12[5] == 0, __LINE__);
}
/*******************************************/
char s13[6] = "hello";
void test13()
{
assert(sizeof(s13) == 6, __LINE__);
assert(s13[4] == 'o', __LINE__);
assert(s13[5] == 0, __LINE__);
}
/*******************************************/
char s14[5] = "hello";
void test14()
{
assert(sizeof(s14) == 5, __LINE__);
assert(s14[4] == 'o', __LINE__);
}
/*******************************************/
char s15[5] = { "hello" };
void test15()
{
assert(sizeof(s15) == 5, __LINE__);
assert(s15[4] == 'o', __LINE__);
}
/*******************************************/
char s16[2][6] = { "hello", "world" };
void test16()
{
assert(sizeof(s16) == 12, __LINE__);
assert(s16[1][2] == 'r', __LINE__);
}
/*******************************************/
char s17[2][6] = { {"hello"}, {"world"} };
void test17()
{
assert(sizeof(s17) == 12, __LINE__);
assert(s17[1][2] == 'r', __LINE__);
}
/*******************************************/
char s18[2][1][6] = { "hello", "world" };
void test18()
{
assert(sizeof(s18) == 12, __LINE__);
assert(s18[1][0][2] == 'r', __LINE__);
}
/*******************************************/
struct S19 { int a, b; };
struct S19 a19[1] = { 1 };
void test19()
{
assert(a19[0].a == 1, __LINE__);
assert(a19[0].b == 0, __LINE__);
}
/*******************************************/
struct S20 { int a, b; };
struct S20 a20[1] = { 1, [0] = 2 };
void test20()
{
assert(a20[0].a == 2, __LINE__);
assert(a20[0].b == 0, __LINE__);
}
/*******************************************/
/* https://issues.dlang.org/show_bug.cgi?id=22994
*/
char cs1[1];
double ds1[1];
char cs[2] = {0};
double ds[2] = {0.0};
struct { char cs[2]; } css = { {0} };
struct { double ds[2]; } dss = { {0} };
union { char cs[2]; } csu = { {0} };
union { double ds[2]; } dsu = { {0} };
void test22994()
{
if (0)
{
printf("%d\n", (int)cs1[0]);
printf("%lf\n", ds1[0]);
printf("%d\n", (int)cs[1]);
printf("%lf\n", ds[1]);
printf("%d\n", (int)css.cs[1]);
printf("%lf\n", dss.ds[1]);
printf("%d\n", (int)csu.cs[1]);
printf("%lf\n", dsu.ds[1]);
printf("%d\n", (int)((char[2]){0})[1]);
printf("%lf\n", ((double[2]){0})[1]);
}
assert(cs1[0]== 0, __LINE__);
assert(ds1[0]== 0, __LINE__);
assert(cs[1]== 0, __LINE__);
assert(ds[1]== 0, __LINE__);
assert(css.cs[1]== 0, __LINE__);
assert(dss.ds[1]== 0, __LINE__);
assert(csu.cs[1]== 0, __LINE__);
assert(dsu.ds[1]== 0, __LINE__);
assert(((char[2]){0})[1]== 0, __LINE__);
assert(((double[2]){0})[1]== 0, __LINE__);
}
/*******************************************/
void test31()
{
static int a[3] = {1, 2, 3};
if (a[0] != 1 ||
a[1] != 2 ||
a[2] != 3)
{
assert(0, __LINE__);
}
}
/*********************************/
void test32()
{
static int a[4] = {1, 2, 3};
if (a[0] != 1 ||
a[1] != 2 ||
a[2] != 3 ||
a[3] != 0)
{
assert(0, __LINE__);
}
}
/*********************************/
void test33()
{
static int a[] = {1, 2, 3};
if (sizeof(a) != 3 * sizeof(int) ||
a[0] != 1 ||
a[1] != 2 ||
a[2] != 3)
{
assert(0, __LINE__);
}
}
/*********************************/
void test34()
{
static int a[3] = {1, 2, 3};
int i;
for (i = 0; i < 3; ++i)
{
if (a[i] != i + 1)
{
assert(0, __LINE__);
}
}
}
/*********************************/
void test35()
{
static int b[3][2] = { 1,2,3,4,5,6 };
int i;
for (i = 0; i < 3; ++i)
{
int j;
for (j = 0; j < 2; ++j)
{
if (b[i][j] != i * 2 + j + 1)
{
assert(0, __LINE__);
}
}
}
}
/*********************************/
void test36()
{
static int c[3][2] = { {1,2},{3,4},{5,6} };
int i;
for (i = 0; i < 3; ++i)
{
int j;
for (j = 0; j < 2; ++j)
{
if (c[i][j] != i * 2 + j + 1)
{
assert(0, __LINE__);
}
}
}
}
/*********************************/
void test37()
{
static int d[3][2] = { {1,2},3,4,{5,6} };
int i;
for (i = 0; i < 3; ++i)
{
int j;
for (j = 0; j < 2; ++j)
{
if (d[i][j] != i * 2 + j + 1)
{
assert(0, __LINE__);
}
}
}
}
/*********************************/
void test23007()
{
static int x[1] = {{1}};
assert(x[0] == 1, __LINE__);
}
/*********************************/
void test38()
{
static int d[3][2] = { {1,2} };
int i;
for (i = 0; i < 3; ++i)
{
int j;
for (j = 0; j < 2; ++j)
{
if (i == 0)
{
if (d[i][j] != j + 1)
{
assert(0, __LINE__);
}
}
else if (d[i][j] != 0)
{
assert(0, __LINE__);
}
}
}
}
/*********************************/
void test38a()
{
int i;
static int a[3] = { 1,2,3 };
// Casting to an array type is not allowed by C11, but
// CompoundLiterals are not there yet to test this
// grammar
i = ((int[3])a)[2];
assert(i == 3, __LINE__);
}
/*********************************/
void test38b()
{
struct S { int a, b; };
static struct S ax[3] = { 0x11,0x22,0x33,0 };
//printf("%x %x %x %x %x %x\n", ax[0].a, ax[0].b, ax[1].a, ax[1].b, ax[2].a, ax[2].b);
if (ax[0].a != 0x11 ||
ax[0].b != 0x22 ||
ax[1].a != 0x33 ||
ax[1].b != 0 ||
ax[2].a != 0 ||
ax[2].b != 0) { assert(0, __LINE__); }
static struct S ay[3] = { {0x11,0x22},0x33,0 };
//printf("%x %x %x %x %x %x\n", ay[0].a, ay[0].b, ay[1].a, ay[1].b, ay[2].a, ay[2].b);
if (ay[0].a != 0x11 ||
ay[0].b != 0x22 ||
ay[1].a != 0x33 ||
ay[1].b != 0 ||
ay[2].a != 0 ||
ay[2].b != 0) { assert(0, __LINE__); }
static struct S az[3] = { 0x11,0x22,{0x33,0} };
//printf("%x %x %x %x %x %x\n", az[0].a, az[0].b, az[1].a, az[1].b, az[2].a, az[2].b);
if (az[0].a != 0x11 ||
az[0].b != 0x22 ||
az[1].a != 0x33 ||
az[1].b != 0 ||
az[2].a != 0 ||
az[2].b != 0) { assert(0, __LINE__); }
}
/*********************************/
void test23006()
{
static struct { int x[1][1]; } y = { {{1}} };
assert(y.x[0][0] == 1, __LINE__);
}
/*********************************/
void test39()
{
int i = 1; assert(i == 1, __LINE__);
int j = { 2 }; assert(j == 2, __LINE__);
int k = { 3,}; assert(k == 3, __LINE__);
static int l = 4; assert(l == 4, __LINE__);
static int m = { 5 }; assert(m == 5, __LINE__);
static int n = { 6,}; assert(n == 6, __LINE__);
}
/*********************************/
void test22610()
{
struct S
{
unsigned char c[4];
};
static struct S c = { 255,255,255,255 };
assert(c.c[0] == 255, __LINE__);
assert(c.c[1] == 255, __LINE__);
assert(c.c[2] == 255, __LINE__);
assert(c.c[3] == 255, __LINE__);
}
/*********************************/
void test40()
{
char s[6] = { "s" }; if (s[0] != 's') { assert(0, __LINE__); }
char t[7] = { "t" }; if (t[0] != 't' && t[1] != 0) { assert(0, __LINE__); }
static char u[6] = { "u" }; if (u[0] != 'u') { assert(0, __LINE__); }
static char v[7] = { "v" }; if (v[0] != 'v' && v[1] != 0) { assert(0, __LINE__); }
}
/*********************************/
void test41()
{
struct S { int a, b; };
struct S s = { 1, 2 };
if (s.a != 1 || s.b != 2) { assert(0, __LINE__); }
static struct S s2 = { 1, };
if (s2.a != 1 || s2.b != 0) { assert(0, __LINE__); }
struct T { int a; struct { int b, c; }; };
struct T t = { 1, 2, 3 };
if (t.a != 1 || t.b != 2 || t.c != 3) { assert(0, __LINE__); }
struct U { int a; union { int b, c; }; int d; };
struct U u = { 1, 2, 3 };
if (u.a != 1 ||
u.b != 2 ||
u.c != 2 ||
u.d != 3) { printf("%d %d %d %d\n", u.a, u.b, u.c, u.d); assert(0, __LINE__); }
}
/*********************************/
void test23230()
{
static char scharkey[4][17] =
{
"define",
"list",
"if",
"lambda"
};
assert(scharkey[0][3] == 'i', __LINE__);
assert(scharkey[1][2] == 's', __LINE__);
assert(scharkey[2][1] == 'f', __LINE__);
assert(scharkey[3][0] == 'l', __LINE__);
}
/*********************************/
// https://issues.dlang.org/show_bug.cgi?id=22652
void test22652()
{
struct S1 {
int x, y;
};
struct S2 {
struct S1 s;
};
struct S2 c = {1};
struct S2 d = {1, 2};
assert(c.s.x == 1, __LINE__);
assert(c.s.y == 0, __LINE__);
assert(d.s.x == 1, __LINE__);
assert(d.s.y == 2, __LINE__);
}
/*********************************/
void test42()
{
int i;
i = (int) { 3 };
assert(i == 3, __LINE__);
}
/*******************************************/
void test43()
{
static int a[2] = { [0] = 1, [1] = 2, };
assert(a[0] == 1, __LINE__);
assert(a[1] == 2, __LINE__);
typedef struct S { int x; } S;
S s = {.x = 3};
assert(s.x == 3, __LINE__);
}
/*******************************************/
// 23027
struct S44 {
int x;
};
void test44()
{
struct S44 s[2] = {3};
assert(s[0].x == 3, __LINE__);
assert(s[1].x == 0, __LINE__);
}
/*******************************************/
// https://issues.dlang.org/show_bug.cgi?id=23338
struct S45 {
char a, b[2];
};
struct S45 s45 = { 1, 2, 3 };
struct S45 t45 = { 'a', "bc" };
void test45()
{
assert(s45.a == 1, __LINE__);
assert(s45.b[0] == 2, __LINE__);
assert(s45.b[1] == 3, __LINE__);
assert(t45.a == 'a', __LINE__);
assert(t45.b[0] == 'b', __LINE__);
assert(t45.b[1] == 'c', __LINE__);
}
/*******************************************/
// https://issues.dlang.org/show_bug.cgi?id=23348
struct SS46 {
char a, b[2];
};
struct S46 {
struct SS46 ss;
char d;
};
static struct S46 s46 = { 1, 2, 3, 4 };
static struct S46 t46 = { 'a', "bc", 'd' };
void test46()
{
assert(s46.ss.a == 1, __LINE__);
assert(s46.ss.b[0] == 2, __LINE__);
assert(s46.ss.b[1] == 3, __LINE__);
assert(s46.d == 4, __LINE__);
assert(t46.ss.a == 'a', __LINE__);
assert(t46.ss.b[0] == 'b', __LINE__);
assert(t46.ss.b[1] == 'c', __LINE__);
assert(t46.d == 'd', __LINE__);
}
/*******************************************/
void test22925()
{
int arr[1][1] = { {1} };
assert(arr[0][0] == 1, __LINE__);
}
/*******************************************/
// https://issues.dlang.org/show_bug.cgi?id=23345
struct S47 { int a, b; };
struct S47 s47 = { .b = 3, .a = 2 };
void test47()
{
assert(s47.b == 3, __LINE__);
assert(s47.a == 2, __LINE__);
}
/*******************************************/
int main()
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
test10();
test11();
test12();
test13();
test14();
test15();
test16();
test17();
test18();
test19();
test20();
test22994();
test31();
test32();
test33();
test34();
test35();
test36();
test37();
test23007();
test38();
test38a();
test38b();
test23006();
test39();
test22610();
test40();
test41();
test23230();
test22652();
test42();
test43();
test44();
test45();
test46();
test22925();
test47();
return 0;
}