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