blob: 3ddfa2ebc9f569e1c87e93490ede1321d803b551 [file] [log] [blame]
/* PR tree-optimization/89688 - -Wstringop-overflow confused by const
2D array of char
{ dg-do compile }
{ dg-options "-Wall -fdump-tree-gimple -fdump-tree-optimized" } */
typedef __SIZE_TYPE__ size_t;
size_t strlen (const char*);
#define CAT(x, y) x ## y
#define CONCAT(x, y) CAT (x, y)
#define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__)
#define FAIL(name) do { \
extern __attribute__ ((noreturn)) void FAILNAME (name) (void); \
FAILNAME (name)(); \
} while (0)
#define A(ref, len) \
if (strlen (ref) != len) FAIL (failure); else (void)0
const char a3_4[3][4] = { { 1 }, { 1, 2 }, { 1, 2, 3 } };
void test_a4_4 (void)
{
A (a3_4[0], 1);
A (a3_4[1], 2);
A (a3_4[2], 3);
A (&a3_4[0][0], 1);
A (&a3_4[0][1], 0);
A (&a3_4[0][2], 0);
A (&a3_4[0][3], 0);
A (&a3_4[1][0], 2);
A (&a3_4[1][1], 1);
A (&a3_4[1][2], 0);
A (&a3_4[1][3], 0);
A (&a3_4[2][0], 3);
A (&a3_4[2][1], 2);
A (&a3_4[2][2], 1);
A (&a3_4[2][3], 0);
}
const char a3_4_5[3][4][5] =
{
{ { 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 } },
{ { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 } },
{ { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 } },
};
void test_a3_4_5 (void)
{
A (a3_4_5[0][0], 1);
A (a3_4_5[0][1], 2);
A (a3_4_5[0][2], 3);
A (a3_4_5[0][3], 4);
A (a3_4_5[1][0], 2);
A (a3_4_5[1][1], 3);
A (a3_4_5[1][2], 4);
A (a3_4_5[1][3], 1);
A (a3_4_5[2][0], 3);
A (a3_4_5[2][1], 4);
A (a3_4_5[2][2], 1);
A (a3_4_5[2][3], 2);
}
struct S
{
char a3[3];
char a4_5[4][5];
};
const struct S sa4[4] =
{
{ .a3 = { 0 },
.a4_5 =
{
{ 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }
}
},
{ .a3 = { 1 },
.a4_5 =
{
{ 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }
}
},
{ .a3 = { 1, 2 },
.a4_5 =
{
{ 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 }
}
},
{ .a3 = { 1 },
.a4_5 =
{
{ 1, 2, 3, 4 }, "1", { 1, 2 }, "123"
}
}
};
void test_sa4 (void)
{
A (sa4[0].a3, 0);
A (sa4[0].a4_5[0], 1);
A (sa4[0].a4_5[1], 2);
A (sa4[0].a4_5[2], 3);
A (sa4[0].a4_5[3], 4);
A (sa4[1].a3, 1);
A (sa4[1].a4_5[0], 2);
A (sa4[1].a4_5[1], 3);
A (sa4[1].a4_5[2], 4);
A (sa4[1].a4_5[3], 1);
A (sa4[2].a3, 2);
A (sa4[2].a4_5[0], 3);
A (sa4[2].a4_5[1], 4);
A (sa4[2].a4_5[2], 1);
A (sa4[2].a4_5[3], 2);
A (sa4[3].a3, 1);
A (sa4[3].a4_5[0], 4);
A (sa4[3].a4_5[1], 1);
A (sa4[3].a4_5[2], 2);
A (sa4[3].a4_5[3], 3);
}
struct T
{
struct S sa2[2];
char a4[4];
};
const struct T ta2[2] =
{
[0] =
{
.sa2 =
{
[0] =
{ .a3 = { 0 },
.a4_5 =
{
{ 1 }, { 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }
}
},
[1] =
{ .a3 = { 1 },
.a4_5 =
{
{ 1, 2 }, { 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }
}
},
},
.a4 = "12"
},
[1] =
{
.sa2 =
{
[0] =
{ .a3 = { 1, 2 },
.a4_5 =
{
{ 1, 2, 3 }, { 1, 2, 3, 4 }, { 1 }, { 1, 2 }
}
},
{ .a3 = { 1 },
.a4_5 =
{
{ 1, 2, 3, 4 }, "1", { 1, 2 }, "123"
}
}
},
.a4 = "123"
}
};
void test_ta2 (void)
{
A (ta2[0].sa2[0].a3, 0);
A (ta2[0].sa2[0].a4_5[0], 1);
A (ta2[0].sa2[0].a4_5[1], 2);
A (ta2[0].sa2[0].a4_5[2], 3);
A (ta2[0].sa2[0].a4_5[3], 4);
A (ta2[0].sa2[1].a3, 1);
A (ta2[0].sa2[1].a4_5[0], 2);
A (ta2[0].sa2[1].a4_5[1], 3);
A (ta2[0].sa2[1].a4_5[2], 4);
A (ta2[0].sa2[1].a4_5[3], 1);
A (ta2[0].a4, 2);
A (ta2[1].sa2[0].a3, 2);
A (ta2[1].sa2[0].a4_5[0], 3);
A (ta2[1].sa2[0].a4_5[1], 4);
A (ta2[1].sa2[0].a4_5[2], 1);
A (ta2[1].sa2[0].a4_5[3], 2);
A (ta2[1].sa2[1].a3, 1);
A (ta2[1].sa2[1].a4_5[0], 4);
A (ta2[1].sa2[1].a4_5[1], 1);
A (ta2[1].sa2[1].a4_5[2], 2);
A (ta2[1].sa2[1].a4_5[3], 3);
A (ta2[1].a4, 3);
}
/* { dg-final { scan-tree-dump-not "failure" "optimized" } }
{ dg-final { scan-tree-dump-not "strlen1" "gimple" } } */