modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/strlen-4.c (about) 1 /* PR tree-optimization/86622 - incorrect strlen of array of array plus 2 variable offset 3 Exercise strlen() with a multi-dimensional array of strings with 4 offsets. */ 5 6 extern int printf (const char*, ...); 7 extern __SIZE_TYPE__ strlen (const char*); 8 9 typedef char A28[28]; 10 typedef A28 A3_28[3]; 11 typedef A3_28 A2_3_28[2]; 12 13 static const A2_3_28 a = { 14 /* [0][0] [0][1] [0][2] */ 15 { "1\00012", "123\0001234", "12345\000123456" }, 16 /* [1][0] [1][1] [1][2] */ 17 { "1234567\00012345678", "123456789\0001234567890", "12345678901\000123456789012" } 18 }; 19 20 volatile int v0 = 0; 21 volatile int v1 = 1; 22 volatile int v2 = 2; 23 volatile int v3 = 3; 24 volatile int v4 = 4; 25 volatile int v5 = 5; 26 volatile int v6 = 6; 27 volatile int v7 = 7; 28 29 #define A(expr, N) \ 30 ((strlen (expr) == N) \ 31 ? (void)0 : (printf ("line %i: strlen (%s = \"%s\") != %i\n", \ 32 __LINE__, #expr, expr, N), \ 33 __builtin_abort ())) 34 35 /* Verify that strlen() involving pointer to array arguments computes 36 the correct result. */ 37 38 void test_array_ptr (void) 39 { 40 /* Compute the length of the string at the refeenced array. */ 41 A (*(&a[0][0] + 0), 1); 42 A (*(&a[0][0] + 1), 3); 43 A (*(&a[0][0] + 2), 5); 44 45 A (*(&a[0][1] - 1), 1); 46 A (*(&a[0][1] + 0), 3); 47 A (*(&a[0][1] + 1), 5); 48 49 A (*(&a[0][2] - 2), 1); 50 A (*(&a[0][2] - 1), 3); 51 A (*(&a[0][2] + 0), 5); 52 53 A (*(&a[1][0] + 0), 7); 54 A (*(&a[1][0] + 1), 9); 55 A (*(&a[1][0] + 2), 11); 56 57 A (*(&a[1][1] - 1), 7); 58 A (*(&a[1][1] + 0), 9); 59 A (*(&a[1][1] + 1), 11); 60 61 A (*(&a[1][2] - 2), 7); 62 A (*(&a[1][2] - 1), 9); 63 A (*(&a[1][2] - 0), 11); 64 65 /* Compute the length of the string past the first nul. */ 66 A (*(&a[0][0] + 0) + 2, 2); 67 A (*(&a[0][0] + 1) + 4, 4); 68 A (*(&a[0][0] + 2) + 6, 6); 69 70 /* Compute the length of the string past the second nul. */ 71 A (*(&a[0][0] + 0) + 5, 0); 72 A (*(&a[0][0] + 1) + 10, 0); 73 A (*(&a[0][0] + 2) + 14, 0); 74 75 int i0 = 0; 76 int i1 = i0 + 1; 77 int i2 = i1 + 1; 78 int i3 = i2 + 1; 79 int i4 = i3 + 1; 80 int i5 = i4 + 1; 81 82 A (*(&a[0][0] + i0), 1); 83 A (*(&a[0][0] + i1), 3); 84 A (*(&a[0][0] + i2), 5); 85 86 A (*(&a[0][1] - i1), 1); 87 A (*(&a[0][1] + i0), 3); 88 A (*(&a[0][1] + i1), 5); 89 90 A (*(&a[0][2] - i2), 1); 91 A (*(&a[0][2] - i1), 3); 92 A (*(&a[0][2] + i0), 5); 93 94 A (*(&a[1][0] + i0), 7); 95 A (*(&a[1][0] + i1), 9); 96 A (*(&a[1][0] + i2), 11); 97 98 A (*(&a[1][1] - i1), 7); 99 A (*(&a[1][1] + i0), 9); 100 A (*(&a[1][1] + i1), 11); 101 102 A (*(&a[1][2] - i2), 7); 103 A (*(&a[1][2] - i1), 9); 104 A (*(&a[1][2] - i0), 11); 105 106 107 A (*(&a[i0][i0] + i0), 1); 108 A (*(&a[i0][i0] + i1), 3); 109 A (*(&a[i0][i0] + i2), 5); 110 111 A (*(&a[i0][i1] - i1), 1); 112 A (*(&a[i0][i1] + i0), 3); 113 A (*(&a[i0][i1] + i1), 5); 114 115 A (*(&a[i0][i2] - i2), 1); 116 A (*(&a[i0][i2] - i1), 3); 117 A (*(&a[i0][i2] + i0), 5); 118 119 A (*(&a[i1][i0] + i0), 7); 120 A (*(&a[i1][i0] + i1), 9); 121 A (*(&a[i1][i0] + i2), 11); 122 123 A (*(&a[i1][i1] - i1), 7); 124 A (*(&a[i1][i1] + i0), 9); 125 A (*(&a[i1][i1] + i1), 11); 126 127 A (*(&a[i1][i2] - i2), 7); 128 A (*(&a[i1][i2] - i1), 9); 129 A (*(&a[i1][i2] - i0), 11); 130 131 132 A (*(&a[i0][i0] + v0), 1); 133 A (*(&a[i0][i0] + v1), 3); 134 A (*(&a[i0][i0] + v2), 5); 135 136 A (*(&a[i0][i1] - v1), 1); 137 A (*(&a[i0][i1] + v0), 3); 138 A (*(&a[i0][i1] + v1), 5); 139 140 A (*(&a[i0][i2] - v2), 1); 141 A (*(&a[i0][i2] - v1), 3); 142 A (*(&a[i0][i2] + v0), 5); 143 144 A (*(&a[i1][i0] + v0), 7); 145 A (*(&a[i1][i0] + v1), 9); 146 A (*(&a[i1][i0] + v2), 11); 147 148 A (*(&a[i1][i1] - v1), 7); 149 A (*(&a[i1][i1] + v0), 9); 150 A (*(&a[i1][i1] + v1), 11); 151 152 A (*(&a[i1][i2] - v2), 7); 153 A (*(&a[i1][i2] - v1), 9); 154 A (*(&a[i1][i2] - v0), 11); 155 156 157 A (*(&a[i0][i0] + v0) + i1, 0); 158 A (*(&a[i0][i0] + v1) + i2, 1); 159 A (*(&a[i0][i0] + v2) + i3, 2); 160 161 A (*(&a[i0][i1] - v1) + v1, 0); 162 A (*(&a[i0][i1] + v0) + v3, 0); 163 A (*(&a[i0][i1] + v1) + v5, 0); 164 165 A (*(&a[i0][v1] - i1) + i1, 0); 166 A (*(&a[i0][v1] + i0) + i3, 0); 167 A (*(&a[i0][v1] + i1) + i5, 0); 168 } 169 170 static const A3_28* const pa0 = &a[0]; 171 static const A3_28* const pa1 = &a[1]; 172 173 static const A3_28* const paa[] = { &a[0], &a[1] }; 174 175 /* Verify that strlen() involving pointers and arrays of pointers 176 to array arguments computes the correct result. */ 177 178 void test_ptr_array (void) 179 { 180 int i0 = 0; 181 int i1 = i0 + 1; 182 int i2 = i1 + 1; 183 int i3 = i2 + 1; 184 185 A (*((*pa0) + i0), 1); 186 A (*((*pa0) + i1), 3); 187 A (*((*pa0) + i2), 5); 188 189 A (*(pa0[0] + i0), 1); 190 A (*(pa0[0] + i1), 3); 191 A (*(pa0[0] + i2), 5); 192 193 A ((*pa0)[i0] + i1, 0); 194 A ((*pa0)[i1] + i2, 1); 195 A ((*pa0)[i2] + i3, 2); 196 197 198 A (*((*pa1) + i0), 7); 199 A (*((*pa1) + i1), 9); 200 A (*((*pa1) + i2), 11); 201 202 A (*(pa1[0] + i0), 7); 203 A (*(pa1[0] + i1), 9); 204 A (*(pa1[0] + i2), 11); 205 206 A ((*pa1)[i0] + i1, 6); 207 A ((*pa1)[i1] + i2, 7); 208 A ((*pa1)[i2] + i3, 8); 209 210 A (*(*(paa[0]) + i0), 1); 211 A (*(*(paa[0]) + i1), 3); 212 A (*(*(paa[0]) + i2), 5); 213 214 A (*(*(paa[1]) + i0), 7); 215 A (*(*(paa[1]) + i1), 9); 216 A (*(*(paa[1]) + i2), 11); 217 218 A (*(*(paa[1]) - i1), 5); 219 A (*(*(paa[1]) - i2), 3); 220 A (*(*(paa[1]) - i3), 1); 221 222 A (*(*(paa[0]) + i0) + i1, 0); 223 A (*(*(paa[0]) + i1) + i2, 1); 224 A (*(*(paa[0]) + i2) + i3, 2); 225 } 226 227 int main (void) 228 { 229 test_array_ptr (); 230 231 test_ptr_array (); 232 }