1 /* PR tree-optimization/86532 - Wrong code due to a wrong strlen folding 2 starting with r262522 3 Exercise strlen() with a multi-dimensional array of strings with 4 embedded nuls. */ 5 6 extern __SIZE_TYPE__ strlen (const char*); 7 8 static const char a[2][3][9] = { 9 { "1", "1\0002" }, 10 { "12\0003", "123\0004" } 11 }; 12 13 volatile int v0 = 0; 14 volatile int v1 = 1; 15 volatile int v2 = 2; 16 volatile int v3 = 3; 17 volatile int v4 = 4; 18 volatile int v5 = 5; 19 volatile int v6 = 6; 20 volatile int v7 = 7; 21 22 #define A(expr) \ 23 ((expr) ? (void)0 : (__builtin_printf ("assertion on line %i: %s\n", \ 24 __LINE__, #expr), \ 25 __builtin_abort ())) 26 test_array_ref(void)27void test_array_ref (void) 28 { 29 int i0 = 0; 30 int i1 = i0 + 1; 31 int i2 = i1 + 1; 32 int i3 = i2 + 1; 33 int i4 = i3 + 1; 34 int i5 = i4 + 1; 35 int i6 = i5 + 1; 36 int i7 = i6 + 1; 37 38 A (strlen (a[0][0]) == 1); 39 A (strlen (a[0][1]) == 1); 40 41 A (strlen (a[1][0]) == 2); 42 A (strlen (a[1][1]) == 3); 43 44 A (strlen (&a[0][0][0]) == 1); 45 A (strlen (&a[0][1][0]) == 1); 46 47 A (strlen (&a[1][0][0]) == 2); 48 A (strlen (&a[1][1][0]) == 3); 49 50 A (strlen (&a[0][0][0] + 1) == 0); 51 A (strlen (&a[0][1][0] + 1) == 0); 52 A (strlen (&a[0][1][0] + 2) == 1); 53 A (strlen (&a[0][1][0] + 3) == 0); 54 A (strlen (&a[0][1][0] + 7) == 0); 55 56 A (strlen (&a[1][0][0] + 1) == 1); 57 A (strlen (&a[1][1][0] + 1) == 2); 58 A (strlen (&a[1][1][0] + 2) == 1); 59 A (strlen (&a[1][1][0] + 7) == 0); 60 61 62 A (strlen (a[i0][i0]) == 1); 63 A (strlen (a[i0][i1]) == 1); 64 65 A (strlen (a[i1][i0]) == 2); 66 A (strlen (a[i1][i1]) == 3); 67 68 A (strlen (&a[i0][i0][i0]) == 1); 69 A (strlen (&a[i0][i1][i0]) == 1); 70 A (strlen (&a[i0][i1][i1]) == 0); 71 A (strlen (&a[i0][i1][i2]) == 1); 72 A (strlen (&a[i0][i1][i3]) == 0); 73 A (strlen (&a[i0][i1][i3]) == 0); 74 75 A (strlen (&a[i1][i0][i0]) == 2); 76 A (strlen (&a[i1][i1][i0]) == 3); 77 A (strlen (&a[i1][i1][i1]) == 2); 78 A (strlen (&a[i1][i1][i2]) == 1); 79 A (strlen (&a[i1][i1][i3]) == 0); 80 A (strlen (&a[i1][i1][i4]) == 1); 81 A (strlen (&a[i1][i1][i5]) == 0); 82 A (strlen (&a[i1][i1][i6]) == 0); 83 A (strlen (&a[i1][i1][i7]) == 0); 84 85 A (strlen (&a[i0][i0][i0] + i1) == 0); 86 A (strlen (&a[i0][i1][i0] + i1) == 0); 87 A (strlen (&a[i0][i1][i0] + i7) == 0); 88 89 A (strlen (&a[i1][i0][i0] + i1) == 1); 90 A (strlen (&a[i1][i1][i0] + i1) == 2); 91 A (strlen (&a[i1][i1][i0] + i2) == 1); 92 A (strlen (&a[i1][i1][i0] + i3) == 0); 93 A (strlen (&a[i1][i1][i0] + i4) == 1); 94 A (strlen (&a[i1][i1][i0] + i5) == 0); 95 A (strlen (&a[i1][i1][i0] + i6) == 0); 96 A (strlen (&a[i1][i1][i0] + i7) == 0); 97 98 99 A (strlen (a[i0][i0]) == 1); 100 A (strlen (a[i0][i1]) == 1); 101 102 A (strlen (a[i1][i0]) == 2); 103 A (strlen (a[i1][i1]) == 3); 104 105 A (strlen (&a[i0][i0][i0]) == 1); 106 A (strlen (&a[i0][i1][i0]) == 1); 107 108 A (strlen (&a[i1][i0][i0]) == 2); 109 A (strlen (&a[i1][i1][i0]) == 3); 110 111 A (strlen (&a[i0][i0][i0] + v1) == 0); 112 A (strlen (&a[i0][i0][i0] + v2) == 0); 113 A (strlen (&a[i0][i0][i0] + v7) == 0); 114 115 A (strlen (&a[i0][i1][i0] + v1) == 0); 116 A (strlen (&a[i0][i1][i0] + v2) == 1); 117 A (strlen (&a[i0][i1][i0] + v3) == 0); 118 119 A (strlen (&a[i1][i0][i0] + v1) == 1); 120 A (strlen (&a[i1][i1][i0] + v1) == 2); 121 A (strlen (&a[i1][i1][i0] + v2) == 1); 122 A (strlen (&a[i1][i1][i0] + v3) == 0); 123 A (strlen (&a[i1][i1][i0] + v4) == 1); 124 A (strlen (&a[i1][i1][i0] + v5) == 0); 125 A (strlen (&a[i1][i1][i0] + v6) == 0); 126 A (strlen (&a[i1][i1][i0] + v7) == 0); 127 } 128 main(void)129int main (void) 130 { 131 test_array_ref (); 132 } 133