Rewrite semantic for CInitializer (#14427)

Co-authored-by: Iain Buclaw <ibuclaw@gdcproject.org>
This commit is contained in:
Walter Bright 2022-09-12 23:42:08 -07:00 committed by GitHub
parent 7cef3b9f3c
commit 277b11017e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 718 additions and 298 deletions

View file

@ -0,0 +1,410 @@
/* Test initializers */
int printf(const char *s, ...);
void exit(int);
void assert(int b, int line)
{
if (!b)
{
printf("failed test %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__);
}
/*******************************************/
int main()
{
test1();
test2();
test3();
test4();
test5();
test6();
test7();
test8();
test9();
test10();
test11();
test12();
test13();
test14();
test15();
test16();
test17();
test18();
test19();
test20();
return 0;
}