| /* 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" } } */ |