1 /* PR c/71924 - missing -Wreturn-local-addr returning alloca result
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 void sink (void*, ...);
16 void *p
= __builtin_alloca (n
);
18 return p
; /* { dg-warning "function returns address of local" } */
22 return_alloca_index_cst (int n
)
24 int *p
= (int*)__builtin_alloca (n
);
27 return p
; /* { dg-warning "function returns address of local" } */
31 return_alloca_plus_cst (int n
)
33 int *p
= (int*)__builtin_alloca (n
);
36 return p
; /* { dg-warning "function returns address of local" } */
40 return_alloca_plus_var (int n
, int i
)
42 char *p
= (char*)__builtin_alloca (n
);
45 return p
; /* { dg-warning "function returns address of local" } */
49 return_alloca_member_1 (int n
)
51 struct A
*p
= (struct A
*)__builtin_alloca (n
);
53 return &p
->a
; /* { dg-warning "function returns address of local" } */
57 return_alloca_member_2 (int n
)
59 struct A
*p
= (struct A
*)__builtin_alloca (n
);
61 return &p
->b
; /* { dg-warning "function returns address of local" } */
65 return_alloca_flexarray (int n
)
67 struct B
*p
= (struct B
*)__builtin_alloca (n
);
69 return p
->c
; /* { dg-warning "function returns address of local" } */
79 return p
; /* { dg-warning "function returns address of local" } */
83 return_array_index_cst (void)
88 return p
; /* { dg-warning "function returns address of local" } */
92 return_array_plus_cst (void)
97 return p
; /* { dg-warning "function returns address of local" } */
101 return_array_plus_var (int i
)
106 return p
; /* { dg-warning "function returns address of local" } */
110 return_array_member_1 (void)
115 return p
; /* { dg-warning "function returns address of local" } */
119 return_array_member_2 (void)
124 return p
; /* { dg-warning "function returns address of local" } */
134 return p
; /* { dg-warning "function returns address of local" } */
138 return_vla_index_cst (int n
)
143 return p
; /* { dg-warning "function returns address of local" } */
147 return_vla_plus_cst (int n
)
152 return p
; /* { dg-warning "function returns address of local" } */
156 return_vla_index_var (int n
, int i
)
161 return p
; /* { dg-warning "function returns address of local" } */
165 return_vla_plus_var (int n
, int i
)
170 return p
; /* { dg-warning "function returns address of local" } */
174 return_vla_member_1 (int n
, int i
)
179 return p
; /* { dg-warning "function returns address of local" } */
183 return_vla_member_2 (int n
, int i
)
188 return p
; /* { dg-warning "function returns address of local" } */
193 return_alloca_or_alloca (int n
, int i
)
195 void *p
= i
? __builtin_alloca (n
* i
) : __builtin_alloca (n
);
197 /* The warning here should really be "function returns". */
198 return p
; /* { dg-warning "function (returns|may return) address of local" } */
202 return_alloca_or_alloca_2 (int n
, int i
)
204 void *p0
= __builtin_alloca (n
);
205 void *p1
= __builtin_alloca (n
* 2);
206 void *p
= i
? p0
: p1
;
209 return p
; /* { dg-warning "function (returns|may return) address of local" } */
213 return_array_or_array (int i
)
219 /* The warning here should really be "function returns". */
220 return p
; /* { dg-warning "function (returns|may return) address of local" } */
224 return_array_or_array_plus_var (int i
, int j
)
232 void *p
= i
< j
? p0
: p1
;
233 sink (a
, b
, p0
, p1
, p
);
234 /* The warning here should really be "function returns". */
235 return p
; /* { dg-warning "function (returns|may return) address of local" } */
238 extern int global
[32];
241 may_return_global_or_alloca (int n
, int i
)
243 void *p
= i
? global
: __builtin_alloca (n
);
245 return p
; /* { dg-warning "function may return address of local" } */
250 may_return_global_or_alloca_plus_cst (int n
, int i
)
252 int *p
= i
? global
: (int*)__builtin_alloca (n
);
255 return p
; /* { dg-warning "function may return address of local" } */
259 may_return_global_or_array (int n
, int i
)
262 void *p
= i
? global
: a
;
264 return p
; /* { dg-warning "function may return address of local" } */
268 may_return_global_or_array_plus_cst (int n
, int i
)
271 int *p
= i
? global
: a
;
274 return p
; /* { dg-warning "function may return address of local" } */
278 may_return_global_or_vla (int n
, int i
)
281 void *p
= i
? global
: a
;
283 return p
; /* { dg-warning "function may return address of local" } */
287 may_return_global_or_vla_plus_cst (int n
, int i
)
290 int *p
= i
? global
: a
;
293 return p
; /* { dg-warning "function may return address of local" } */