libcpp, c, middle-end: Optimize initializers using #embed in C
[official-gcc.git] / gcc / testsuite / gcc.dg / Wreturn-local-addr-4.c
blob4a3b07ba02cd4b4f9e7888cc8d8dedd55a5bf1a5
1 /* PR c/71924 - missing -Wreturn-local-addr returning alloca result
2 { dg-do compile }
3 { dg-options "-O2 -Wall" }
4 { dg-require-effective-target alloca } */
6 #define ATTR(...) __attribute__ ((__VA_ARGS__))
8 struct A { int a, b, c; };
9 struct B { int a, b, c[]; };
11 extern int g1[5], g2[5], g3[5], g4[5], g5[5];
13 void sink (void*, ...);
15 ATTR (noipa) void*
16 return_2_locals (int i)
18 int a[1]; /* { dg-message "declared here" } */
19 int b[2]; /* { dg-message "declared here" } */
20 void *p = b;
21 if (i < 0)
22 p = a;
24 sink (p);
26 return p; /* { dg-warning "function returns address of local" } */
29 ATTR (noipa) void*
30 return_2_locals_after_2_globals (int i, int j)
32 int a[1]; /* { dg-message "declared here" } */
33 int b[2]; /* { dg-message "declared here" } */
35 int *p;
36 if (i < 0)
37 p = g1;
38 else
39 p = g2;
41 sink (p);
43 if (j < 0)
44 p = a;
45 else
46 p = b;
48 sink (p);
50 return p; /* { dg-warning "function returns address of local" } */
53 ATTR (noipa) void*
54 return_3_locals (int i)
56 int a[1]; /* { dg-message "declared here" } */
57 int b[2]; /* { dg-message "declared here" } */
58 int c[3]; /* { dg-message "declared here" } */
60 void *p = b + 1;
61 if (i < 0)
62 p = a;
63 else if (0 < i)
64 p = c + 2;
66 sink (p);
68 return p; /* { dg-warning "function returns address of local" } */
71 ATTR (noipa) void*
72 return_5_locals (int i)
74 int a[1]; /* { dg-message "declared here" } */
75 int b[2]; /* { dg-message "declared here" } */
76 int c[3]; /* { dg-message "declared here" } */
77 int d[4]; /* { dg-message "declared here" } */
78 int e[5]; /* { dg-message "declared here" } */
80 void *p = &c[2];
81 if (i < -1)
82 p = a;
83 else if (i < 0)
84 p = &b[1];
85 else if (1 < i)
86 p = &e[4];
87 else if (0 < i)
88 p = &d[3];
90 sink (p);
92 return p; /* { dg-warning "function returns address of local" } */
95 ATTR (noipa) void*
96 return_5_locals_switch (int i)
98 int a[1]; /* { dg-message "declared here" } */
99 int b[2]; /* { dg-message "declared here" } */
100 int c[3]; /* { dg-message "declared here" } */
101 int d[4]; /* { dg-message "declared here" } */
102 int e[5]; /* { dg-message "declared here" } */
104 void *p = 0;
106 switch (i)
108 case 0: p = &a[1]; break;
109 case 1: p = &b[2]; break;
110 case 2: p = &c[3]; break;
111 case 3: p = &d[4]; break;
112 default: p = &e[5]; break;
115 sink (p);
117 return p; /* { dg-warning "function returns address of local" } */
120 ATTR (noipa) void*
121 return_1_global_4_locals (int i)
123 int a[1]; /* { dg-message "declared here" } */
124 int b[2]; /* { dg-message "declared here" } */
125 int c[3]; /* { dg-message "declared here" } */
126 int d[4]; /* { dg-message "declared here" } */
128 void *p = c;
129 if (i < -1)
130 sink (p = a);
131 else if (i < 0)
132 sink (p = b);
133 else if (1 < i)
134 sink (p = g1);
135 else if (0 < i)
136 sink (p = d);
138 sink (p, a, b, c, d);
140 return p; /* { dg-warning "function may return address of local" } */
143 ATTR (noipa) void*
144 return_1_global_4_locals_switch (int i)
146 int a[1]; /* { dg-message "declared here" } */
147 int b[2]; /* { dg-message "declared here" } */
148 int c[3]; /* { dg-message "declared here" } */
149 int d[4]; /* { dg-message "declared here" } */
151 void *p = 0;
153 switch (i)
155 case 0: p = &a[0]; break;
156 case 1: p = &b[1]; break;
157 case 2: p = &c[2]; break;
158 case 3: p = &d[3]; break;
161 sink (p);
163 return p; /* { dg-warning "function may return address of local" } */
166 ATTR (noipa) void*
167 return_2_globals_3_locals (int i)
169 int a[1]; /* { dg-message "declared here" } */
170 int b[2]; /* { dg-message "declared here" } */
171 int c[3]; /* { dg-message "declared here" } */
173 void *p = c;
174 if (i < -1)
175 p = a;
176 else if (i < 0)
177 p = b;
178 else if (1 < i)
179 p = g1;
180 else if (0 < i)
181 p = g2;
183 sink (p);
185 return p; /* { dg-warning "function may return address of local" } */
188 ATTR (noipa) void*
189 return_3_globals_2_locals (int i)
191 int a[1]; /* { dg-message "declared here" } */
192 int b[2]; /* { dg-message "declared here" } */
194 void *p = g3;
195 if (i < -1)
196 p = a;
197 else if (i < 0)
198 p = b;
199 else if (1 < i)
200 p = g1;
201 else if (0 < i)
202 p = g2;
204 sink (p);
206 return p; /* { dg-warning "function may return address of local" } */
209 ATTR (noipa) void*
210 return_4_globals_1_local (int i)
212 int a[1]; /* { dg-message "declared here" } */
214 void *p = g3;
215 if (i < -1)
216 p = a;
217 else if (i < 0)
218 p = g1;
219 else if (1 < i)
220 p = g2;
221 else if (0 < i)
222 p = g4;
224 sink (p);
226 return p; /* { dg-warning "function may return address of local" } */
229 ATTR (noipa) void*
230 return_all_globals (int i)
232 void *p = g4;
233 if (i < -1)
234 p = g1;
235 else if (i < 0)
236 p = g2;
237 else if (1 < i)
238 p = g3;
239 else if (0 < i)
240 p = g5;
241 return p;
245 ATTR (noipa) void*
246 return_2_alloca_local_cstoff (int n, int i)
248 int *a = __builtin_alloca (n); /* { dg-message "declared here" } */
249 int *b = __builtin_alloca (n); /* { dg-message "declared here" } */
250 int *p = i < 0 ? a : b;
252 p += 1;
253 sink (p);
255 return p; /* { dg-warning "function returns address of local" } */
258 ATTR (noipa) void*
259 return_alloca_local_cstoff (int n, int i)
261 int *a = __builtin_alloca (n); /* { dg-message "declared here" } */
262 int b[2]; /* { dg-message "declared here" } */
264 int *p = b;
265 if (i < 0)
266 p = a;
268 p += 1;
269 sink (p);
271 return p; /* { dg-warning "function returns address of local" } */
274 ATTR (noipa) void*
275 return_local_alloca_cstoff (int n, int i)
277 int a[2]; /* { dg-message "declared here" } */
278 int *b = __builtin_alloca (n); /* { dg-message "declared here" } */
279 int *p = b;
280 if (i < 0)
281 p = a;
283 p += 1;
284 sink (p);
286 return p; /* { dg-warning "function returns address of local" } */
289 ATTR (noipa) void*
290 return_2_locals_cstoff (int i)
292 int a[1]; /* { dg-message "declared here" } */
293 int b[2]; /* { dg-message "declared here" } */
295 int *p = b;
296 if (i < 0)
297 p = a;
299 p += 1;
300 sink (p);
302 return p; /* { dg-warning "function returns address of local" } */
305 ATTR (noipa) void*
306 return_2_globals_3_locals_cstoff (int i)
308 int a[1]; /* { dg-message "declared here" } */
309 int b[2]; /* { dg-message "declared here" } */
310 int c[3]; /* { dg-message "declared here" } */
312 int *p = c;
313 if (i < -1)
314 p = a;
315 else if (i < 0)
316 p = b;
317 else if (1 < i)
318 p = g1;
319 else if (0 < i)
320 p = g2;
322 p += 1;
323 sink (p);
325 return p; /* { dg-warning "function may return address of local" } */
328 ATTR (noipa) void*
329 return_3_globals_alloca_local_varoff (int n, int i, int j)
331 int *a = __builtin_alloca (n); /* { dg-message "declared here" } */
332 int b[2]; /* { dg-message "declared here" } */
334 int *p = g3;
335 if (i < -1)
336 p = a;
337 else if (i < 0)
338 p = b;
339 else if (1 < i)
340 p = g1;
341 else if (0 < i)
342 p = g2;
344 p += j;
345 sink (p);
347 return p; /* { dg-warning "function may return address of local" } */
350 ATTR (noipa) void*
351 return_3_globals_2_locals_varoff (int i, int j)
353 int a[1]; /* { dg-message "declared here" } */
354 int b[2]; /* { dg-message "declared here" } */
356 int *p = g3;
357 if (i < -1)
358 p = a;
359 else if (i < 0)
360 p = b;
361 else if (1 < i)
362 p = g1;
363 else if (0 < i)
364 p = g2;
366 p += j;
367 sink (p);
369 return p; /* { dg-warning "function may return address of local" } */