blob: 5de9ade4d4339efdbd1c7d2921a8bf67f0f81701 [file] [log] [blame]
// PR c++/90947 - Simple lookup table of array of strings is miscompiled
// { dg-do compile }
// { dg-options "-O1 -fdump-tree-optimized" }
#define assert(expr) ((expr) ? (void)0 : __builtin_abort ())
void pr90947 (void)
{
int vecsize = 4;
int index = 0;
static const char *a[4][4] =
{
{ ".x", ".y", ".z", ".w" },
{ ".xy", ".yz", ".zw", 0 },
{ ".xyz", ".yzw", 0, 0 },
{ "", 0, 0, 0 },
};
assert (vecsize >= 1 && vecsize <= 4);
assert (index >= 0 && index < 4);
assert (a[vecsize - 1][index]);
}
void f_a1_1 (void)
{
{
const char* a[1][1] = { { 0 } };
assert (0 == a[0][0]);
}
{
const char* a[1][1] = { { "" } };
assert ('\0' == *a[0][0]);
}
}
void f_a2_1 (void)
{
{
const char* a[2][1] = { { "" }, { "" } };
assert ('\0' == *a[0][0] && '\0' == *a[1][0]);
}
{
const char* a[2][1] = { { 0 }, { "" } };
assert (0 == a[0][0] && '\0' == *a[1][0]);
}
{
const char* a[2][1] = { { }, { "" } };
assert (0 == a[0][0] && '\0' == *a[1][0]);
}
}
void f_a2_2 (void)
{
{
const char* a[2][2] = { { "", "" }, { "", "" } };
assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
assert ('\0' == *a[1][0] && '\0' == *a[1][1]);
}
{
const char* a[2][2] = { { "", "" }, { "", 0 } };
assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
assert ('\0' == *a[1][0] && 0 == a[1][1]);
}
{
const char* a[2][2] = { { "", "" }, { "" } };
assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
assert ('\0' == *a[1][0] && 0 == a[1][1]);
}
{
const char* a[2][2] = { { "", "" }, { 0, "" } };
assert ('\0' == *a[0][0] && '\0' == *a[0][1]);
assert (0 == a[1][0] && '\0' == *a[1][1]);
}
{
const char* a[2][2] = { { "", 0 }, { 0, "" } };
assert ('\0' == *a[0][0] && 0 == a[0][1]);
assert (0 == a[1][0] && '\0' == *a[1][1]);
}
{
const char* a[2][2] = { { 0, 0 }, { 0, "" } };
assert (0 == a[0][0] && 0 == a[0][1]);
assert (0 == a[1][0] && '\0' == *a[1][1]);
}
{
const char* a[2][2] = { { 0 }, { 0, "" } };
assert (0 == a[0][0] && 0 == a[0][1]);
assert (0 == a[1][0] && '\0' == *a[1][1]);
}
{
const char* a[2][2] = { { }, { 0, "" } };
assert (0 == a[0][0] && 0 == a[0][1]);
assert (0 == a[1][0] && '\0' == *a[1][1]);
}
}
void f_a2_2_2 (void)
{
{
const char* a[2][2][2] =
{ { { "", "" }, { "", "" } }, { { "", "" }, { "", "" } } };
assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
assert ('\0' == *a[1][0][0] && '\0' == *a[1][0][1]);
assert ('\0' == *a[1][1][0] && '\0' == *a[1][1][1]);
}
{
const char* a[2][2][2] =
{ { { "", "" }, { "", "" } }, { { "", "" }, { 0, "" } } };
assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
assert ('\0' == *a[1][0][0] && '\0' == *a[1][0][1]);
assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
}
{
const char* a[2][2][2] =
{ { { "", "" }, { "", "" } }, { { 0, 0 }, { 0, "" } } };
assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
assert ('\0' == *a[0][1][0] && '\0' == *a[0][1][1]);
assert (0 == a[1][0][0] && 0 == a[1][0][1]);
assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
}
{
const char* a[2][2][2] =
{ { { "", "" }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
assert ('\0' == *a[0][0][0] && '\0' == *a[0][0][1]);
assert (0 == a[0][1][0] && 0 == a[0][1][1]);
assert (0 == a[1][0][0] && 0 == a[1][0][1]);
assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
}
{
const char* a[2][2][2] =
{ { { 0, 0 }, { 0, 0 } }, { { 0, 0 }, { 0, "" } } };
assert (0 == a[0][0][0] && 0 == a[0][0][1]);
assert (0 == a[0][1][0] && 0 == a[0][1][1]);
assert (0 == a[1][0][0] && 0 == a[1][0][1]);
assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
}
{
const char* a[2][2][2] =
{ { { }, { } }, { { }, { 0, "" } } };
assert (0 == a[0][0][0] && 0 == a[0][0][1]);
assert (0 == a[0][1][0] && 0 == a[0][1][1]);
assert (0 == a[1][0][0] && 0 == a[1][0][1]);
assert (0 == a[1][1][0] && '\0' == *a[1][1][1]);
}
}
void f_sa2_2_2 (void)
{
struct S { const char a[2], *s, c; };
{
const struct S a[2][2][2] = {
{ },
{
{ { }, { "", "" } },
{ }
}
};
assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s && 0 == a[0][0][0].c);
assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s && 0 == a[0][0][1].c);
assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s && 0 == a[0][1][0].c);
assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s && 0 == a[0][1][1].c);
assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s && 0 == a[1][0][0].c);
assert ('\0' == *a[1][0][1].a && '\0' == *a[1][0][1].s && 0 == a[1][0][1].c);
assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s && 0 == a[1][1][0].c);
assert ('\0' == *a[1][1][1].a && 0 == a[1][1][1].s && 0 == a[1][1][1].c);
}
{
const struct S a[2][2][2] = {
{ },
{
{ { } },
{ { "", "" } }
}
};
assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
assert ('\0' == *a[1][1][0].a && '\0' == *a[1][1][0].s);
assert ('\0' == *a[1][1][1].a && 0 == a[1][1][1].s);
}
{
const struct S a[2][2][2] = {
{ },
{
{ { }, { } },
{ { }, { "", "", 0 } }
}
};
assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s);
assert ('\0' == *a[1][1][1].a && '\0' == *a[1][1][1].s);
}
{
const struct S a[2][2][2] = {
{
{ { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
{ { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
},
{
{ { { 0 }, 0, 0 }, { { 0 } , 0, 0 } },
{ { }, { "", "", 0 } }
}
};
assert ('\0' == *a[0][0][0].a && 0 == a[0][0][0].s);
assert ('\0' == *a[0][0][1].a && 0 == a[0][0][1].s);
assert ('\0' == *a[0][1][0].a && 0 == a[0][1][0].s);
assert ('\0' == *a[0][1][1].a && 0 == a[0][1][1].s);
assert ('\0' == *a[1][0][0].a && 0 == a[1][0][0].s);
assert ('\0' == *a[1][0][1].a && 0 == a[1][0][1].s);
assert ('\0' == *a[1][1][0].a && 0 == a[1][1][0].s);
assert ('\0' == *a[1][1][1].a && '\0' == *a[1][1][1].s);
}
}
// { dg-final { scan-tree-dump-not "abort" "optimized" } }