]>
Commit | Line | Data |
---|---|---|
7802a8ec MS |
1 | /* PR tree-optimization/90662 - strlen of a string in a vla plus offset |
2 | not folded | |
3 | Verify that strlen of pointers to char arrays are computed correctly | |
4 | (whether folded or not). | |
5 | { dg-do run } | |
6 | { dg-options "-O2 -Wall" } */ | |
7 | ||
8 | #include "strlenopt.h" | |
9 | ||
10 | #define A(expr) \ | |
11 | ((expr) \ | |
12 | ? (void)0 \ | |
13 | : (__builtin_printf ("assertion failed on line %i: %s\n", \ | |
14 | __LINE__, #expr), \ | |
15 | __builtin_abort ())) | |
16 | ||
17 | typedef char A5[5]; | |
18 | ||
19 | A5 a5[5]; | |
20 | A5* p[5] = { &a5[4], &a5[3], &a5[2], &a5[1], &a5[0] }; | |
21 | ||
22 | __attribute__ ((noclone, noinline, noipa)) | |
23 | void deref_deref (void) | |
24 | { | |
25 | strcpy (**p, "12345"); | |
26 | A (strlen (**p) == 5); | |
27 | } | |
28 | ||
29 | __attribute__ ((noclone, noinline, noipa)) | |
30 | void deref_idx_0 (void) | |
31 | { | |
32 | strcpy (*p[0], ""); | |
33 | A (strlen (*p[0]) == 0); | |
34 | } | |
35 | ||
36 | __attribute__ ((noclone, noinline, noipa)) | |
37 | void deref_idx_1 (void) | |
38 | { | |
39 | strcpy (*p[1], "1"); | |
40 | A (strlen (*p[1]) == 1); | |
41 | A (strlen (&(*p[1])[1]) == 0); | |
42 | ||
43 | A (strlen (*p[0]) == 0); | |
44 | } | |
45 | ||
46 | __attribute__ ((noclone, noinline, noipa)) | |
47 | void deref_idx_2 (void) | |
48 | { | |
49 | strcpy (*p[2], "12"); | |
50 | A (strlen (*p[2]) == 2); | |
51 | A (strlen (&(*p[2])[1]) == 1); | |
52 | A (strlen (&(*p[2])[2]) == 0); | |
53 | ||
54 | A (strlen (*p[1]) == 1); | |
55 | A (strlen (*p[0]) == 0); | |
56 | } | |
57 | ||
58 | __attribute__ ((noclone, noinline, noipa)) | |
59 | void deref_idx_3 (void) | |
60 | { | |
61 | strcpy (*p[3], "123"); | |
62 | A (strlen (*p[3]) == 3); | |
63 | A (strlen (&(*p[3])[1]) == 2); | |
64 | A (strlen (&(*p[3])[2]) == 1); | |
65 | A (strlen (&(*p[3])[3]) == 0); | |
66 | ||
67 | A (strlen (*p[2]) == 2); | |
68 | A (strlen (*p[1]) == 1); | |
69 | A (strlen (*p[0]) == 0); | |
70 | } | |
71 | ||
72 | __attribute__ ((noclone, noinline, noipa)) | |
73 | void deref_idx_4 (void) | |
74 | { | |
75 | strcpy (*p[4], "1234"); | |
76 | A (strlen (*p[4]) == 4); | |
77 | A (strlen (&(*p[4])[1]) == 3); | |
78 | A (strlen (&(*p[4])[2]) == 2); | |
79 | A (strlen (&(*p[4])[3]) == 1); | |
80 | A (strlen (&(*p[4])[4]) == 0); | |
81 | ||
82 | A (strlen (*p[3]) == 3); | |
83 | A (strlen (*p[2]) == 2); | |
84 | A (strlen (*p[1]) == 1); | |
85 | A (strlen (*p[0]) == 0); | |
86 | } | |
87 | ||
88 | __attribute__ ((noclone, noinline, noipa)) | |
89 | void deref_idx_4_x (void) | |
90 | { | |
91 | strcpy (*p[4], ""); | |
92 | A (strlen (*p[4]) == 0); | |
93 | A (strlen (*p[3]) == 3); | |
94 | A (strlen (*p[2]) == 2); | |
95 | A (strlen (*p[1]) == 1); | |
96 | A (strlen (*p[0]) == 0); | |
97 | } | |
98 | ||
99 | __attribute__ ((noclone, noinline, noipa)) | |
100 | void deref_idx_3_x (void) | |
101 | { | |
102 | strcpy (&(*p[3])[0], "1"); | |
103 | A (strlen (*p[4]) == 0); | |
104 | A (strlen (*p[3]) == 1); | |
105 | A (strlen (*p[2]) == 2); | |
106 | A (strlen (*p[1]) == 1); | |
107 | A (strlen (*p[0]) == 0); | |
108 | } | |
109 | ||
110 | __attribute__ ((noclone, noinline, noipa)) | |
111 | void deref_idx_2_x (void) | |
112 | { | |
113 | strcpy (*p[2], "12"); | |
114 | A (strlen (*p[4]) == 0); | |
115 | A (strlen (*p[3]) == 1); | |
116 | A (strlen (*p[2]) == 2); | |
117 | A (strlen (*p[1]) == 1); | |
118 | A (strlen (*p[0]) == 0); | |
119 | } | |
120 | ||
121 | __attribute__ ((noclone, noinline, noipa)) | |
122 | void deref_idx_1_x (void) | |
123 | { | |
124 | strcpy (*p[1], "123"); | |
125 | A (strlen (*p[4]) == 0); | |
126 | A (strlen (*p[3]) == 1); | |
127 | A (strlen (*p[2]) == 2); | |
128 | A (strlen (*p[1]) == 3); | |
129 | A (strlen (*p[0]) == 0); | |
130 | } | |
131 | ||
132 | __attribute__ ((noclone, noinline, noipa)) | |
133 | void deref_idx_0_x (void) | |
134 | { | |
135 | strcpy (*p[0], "1234"); | |
136 | A (strlen (*p[4]) == 0); | |
137 | A (strlen (*p[3]) == 1); | |
138 | A (strlen (*p[2]) == 2); | |
139 | A (strlen (*p[1]) == 3); | |
140 | A (strlen (*p[0]) == 4); | |
141 | } | |
142 | ||
143 | int main (void) | |
144 | { | |
145 | deref_deref (); | |
146 | ||
147 | deref_idx_0 (); | |
148 | deref_idx_1 (); | |
149 | deref_idx_2 (); | |
150 | deref_idx_3 (); | |
151 | deref_idx_4 (); | |
152 | ||
153 | deref_idx_4_x (); | |
154 | deref_idx_3_x (); | |
155 | deref_idx_2_x (); | |
156 | deref_idx_1_x (); | |
157 | deref_idx_0_x (); | |
158 | } |