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)27 void 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)129 int main (void)
130 {
131   test_array_ref ();
132 }
133