comparison gcc/testsuite/gcc.c-torture/execute/strlen-2.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
comparison
equal deleted inserted replaced
111:04ced10e8804 131:84e7813d76e9
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
17 void 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
56 void 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
95 void 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
158 void 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
203 int 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 }