1 /* PR tree-optimization/86532 - Wrong code due to a wrong strlen folding */ 2 3 extern __SIZE_TYPE__ strlen (const char*); 4 5 static const char a[2][3] = { "1", "12" }; 6 static const char b[2][2][5] = { { "1", "12" }, { "123", "1234" } }; 7 8 volatile int v0 = 0; 9 volatile int v1 = 1; 10 volatile int v2 = 2; 11 12 #define A(expr) \ 13 ((expr) ? (void)0 : (__builtin_printf ("assertion on line %i: %s\n", \ 14 __LINE__, #expr), \ 15 __builtin_abort ())) 16 test_array_ref_2_3(void)17void test_array_ref_2_3 (void) 18 { 19 A (strlen (a[v0]) == 1); 20 A (strlen (&a[v0][v0]) == 1); 21 A (strlen (&a[0][v0]) == 1); 22 A (strlen (&a[v0][0]) == 1); 23 24 A (strlen (a[v1]) == 2); 25 A (strlen (&a[v1][0]) == 2); 26 A (strlen (&a[1][v0]) == 2); 27 A (strlen (&a[v1][v0]) == 2); 28 29 A (strlen (&a[v1][1]) == 1); 30 A (strlen (&a[v1][1]) == 1); 31 32 A (strlen (&a[v1][2]) == 0); 33 A (strlen (&a[v1][v2]) == 0); 34 35 int i0 = 0; 36 int i1 = i0 + 1; 37 int i2 = i1 + 1; 38 39 A (strlen (a[v0]) == 1); 40 A (strlen (&a[v0][v0]) == 1); 41 A (strlen (&a[i0][v0]) == 1); 42 A (strlen (&a[v0][i0]) == 1); 43 44 A (strlen (a[v1]) == 2); 45 A (strlen (&a[v1][i0]) == 2); 46 A (strlen (&a[i1][v0]) == 2); 47 A (strlen (&a[v1][v0]) == 2); 48 49 A (strlen (&a[v1][i1]) == 1); 50 A (strlen (&a[v1][i1]) == 1); 51 52 A (strlen (&a[v1][i2]) == 0); 53 A (strlen (&a[v1][v2]) == 0); 54 } 55 test_array_off_2_3(void)56void test_array_off_2_3 (void) 57 { 58 A (strlen (a[0] + 0) == 1); 59 A (strlen (a[0] + v0) == 1); 60 A (strlen (a[v0] + 0) == 1); 61 A (strlen (a[v0] + v0) == 1); 62 63 A (strlen (a[v1] + 0) == 2); 64 A (strlen (a[1] + v0) == 2); 65 A (strlen (a[v1] + 0) == 2); 66 A (strlen (a[v1] + v0) == 2); 67 68 A (strlen (a[v1] + 1) == 1); 69 A (strlen (a[v1] + v1) == 1); 70 71 A (strlen (a[v1] + 2) == 0); 72 A (strlen (a[v1] + v2) == 0); 73 74 int i0 = 0; 75 int i1 = i0 + 1; 76 int i2 = i1 + 1; 77 78 A (strlen (a[i0] + i0) == 1); 79 A (strlen (a[i0] + v0) == 1); 80 A (strlen (a[v0] + i0) == 1); 81 A (strlen (a[v0] + v0) == 1); 82 83 A (strlen (a[v1] + i0) == 2); 84 A (strlen (a[i1] + v0) == 2); 85 A (strlen (a[v1] + i0) == 2); 86 A (strlen (a[v1] + v0) == 2); 87 88 A (strlen (a[v1] + i1) == 1); 89 A (strlen (a[v1] + v1) == 1); 90 91 A (strlen (a[v1] + i2) == 0); 92 A (strlen (a[v1] + v2) == 0); 93 } 94 test_array_ref_2_2_5(void)95void test_array_ref_2_2_5 (void) 96 { 97 A (strlen (b[0][v0]) == 1); 98 A (strlen (b[v0][0]) == 1); 99 100 A (strlen (&b[0][0][v0]) == 1); 101 A (strlen (&b[0][v0][0]) == 1); 102 A (strlen (&b[v0][0][0]) == 1); 103 104 A (strlen (&b[0][v0][v0]) == 1); 105 A (strlen (&b[v0][0][v0]) == 1); 106 A (strlen (&b[v0][v0][0]) == 1); 107 108 A (strlen (b[0][v1]) == 2); 109 A (strlen (b[v1][0]) == 3); 110 111 A (strlen (&b[0][0][v1]) == 0); 112 A (strlen (&b[0][v1][0]) == 2); 113 A (strlen (&b[v0][0][0]) == 1); 114 115 A (strlen (&b[0][v0][v0]) == 1); 116 A (strlen (&b[v0][0][v0]) == 1); 117 A (strlen (&b[v0][v0][0]) == 1); 118 119 A (strlen (&b[0][v1][v1]) == 1); 120 A (strlen (&b[v1][0][v1]) == 2); 121 A (strlen (&b[v1][v1][0]) == 4); 122 A (strlen (&b[v1][v1][1]) == 3); 123 A (strlen (&b[v1][v1][2]) == 2); 124 125 int i0 = 0; 126 int i1 = i0 + 1; 127 int i2 = i1 + 1; 128 129 A (strlen (b[i0][v0]) == 1); 130 A (strlen (b[v0][i0]) == 1); 131 132 A (strlen (&b[i0][i0][v0]) == 1); 133 A (strlen (&b[i0][v0][i0]) == 1); 134 A (strlen (&b[v0][i0][i0]) == 1); 135 136 A (strlen (&b[i0][v0][v0]) == 1); 137 A (strlen (&b[v0][i0][v0]) == 1); 138 A (strlen (&b[v0][v0][i0]) == 1); 139 140 A (strlen (b[i0][v1]) == 2); 141 A (strlen (b[v1][i0]) == 3); 142 143 A (strlen (&b[i0][i0][v1]) == 0); 144 A (strlen (&b[i0][v1][i0]) == 2); 145 A (strlen (&b[v0][i0][i0]) == 1); 146 147 A (strlen (&b[i0][v0][v0]) == 1); 148 A (strlen (&b[v0][i0][v0]) == 1); 149 A (strlen (&b[v0][v0][i0]) == 1); 150 151 A (strlen (&b[i0][v1][v1]) == 1); 152 A (strlen (&b[v1][i0][v1]) == 2); 153 A (strlen (&b[v1][v1][i0]) == 4); 154 A (strlen (&b[v1][v1][i1]) == 3); 155 A (strlen (&b[v1][v1][i2]) == 2); 156 } 157 test_array_off_2_2_5(void)158void test_array_off_2_2_5 (void) 159 { 160 A (strlen (b[0][0] + v0) == 1); 161 A (strlen (b[0][v0] + v0) == 1); 162 A (strlen (b[v0][0] + v0) == 1); 163 A (strlen (b[v0][v0] + v0) == 1); 164 165 A (strlen (b[0][0] + v1) == 0); 166 A (strlen (b[0][v1] + 0) == 2); 167 A (strlen (b[v0][0] + 0) == 1); 168 169 A (strlen (b[0][v0] + v0) == 1); 170 A (strlen (b[v0][0] + v0) == 1); 171 A (strlen (b[v0][v0] + 0) == 1); 172 173 A (strlen (b[0][v1] + v1) == 1); 174 A (strlen (b[v1][0] + v1) == 2); 175 A (strlen (b[v1][v1] + 0) == 4); 176 A (strlen (b[v1][v1] + 1) == 3); 177 A (strlen (b[v1][v1] + 2) == 2); 178 179 int i0 = 0; 180 int i1 = i0 + 1; 181 int i2 = i1 + 1; 182 183 A (strlen (b[i0][i0] + v0) == 1); 184 A (strlen (b[i0][v0] + v0) == 1); 185 A (strlen (b[v0][i0] + v0) == 1); 186 A (strlen (b[v0][v0] + v0) == 1); 187 188 A (strlen (b[i0][i0] + v1) == 0); 189 A (strlen (b[i0][v1] + i0) == 2); 190 A (strlen (b[v0][i0] + i0) == 1); 191 192 A (strlen (b[i0][v0] + v0) == 1); 193 A (strlen (b[v0][i0] + v0) == 1); 194 A (strlen (b[v0][v0] + i0) == 1); 195 196 A (strlen (b[i0][v1] + v1) == 1); 197 A (strlen (b[v1][i0] + v1) == 2); 198 A (strlen (b[v1][v1] + i0) == 4); 199 A (strlen (b[v1][v1] + i1) == 3); 200 A (strlen (b[v1][v1] + i2) == 2); 201 } 202 main()203int main () 204 { 205 test_array_ref_2_3 (); 206 test_array_off_2_3 (); 207 208 test_array_ref_2_2_5 (); 209 test_array_off_2_2_5 (); 210 } 211