c++: prvalue of array type [PR111286]
[official-gcc.git] / gcc / testsuite / c-c++-common / Wuse-after-free-5.c
blobc6ff1f3fad2c27eba6479f6a70b2565a45bec687
1 /* Verify -Wuse-after-free=2 triggers for conditional as well as
2 unconditional uses but not for equality expressions.
3 { dg-do compile }
4 { dg-options "-O0 -Wall -Wuse-after-free=2" } */
7 #if __cplusplus
8 # define EXTERN_C extern "C"
9 #else
10 # define EXTERN_C extern
11 #endif
13 EXTERN_C void free (void*);
15 void sink (void*);
18 void warn_double_free (void *p)
20 free (p);
21 free (p); // { dg-warning "pointer 'p' used" }
24 void warn_cond_double_free (void *p, int c)
26 free (p);
27 if (c)
28 free (p); // { dg-warning "pointer 'p' may be used" }
31 void warn_call_after_free (void *p)
33 free (p);
34 sink (p); // { dg-warning "pointer 'p' used" }
37 void warn_cond_call_after_free (void *p, int c)
39 free (p);
40 if (c)
41 sink (p); // { dg-warning "pointer 'p' may be used" }
44 void* warn_return_after_free (void *p)
46 free (p);
47 return p; // { dg-warning "pointer 'p' used" }
50 void* warn_cond_return_after_free (void *p, int c)
52 free (p);
53 if (c)
54 return p; // { dg-warning "pointer 'p' may be used" }
55 return 0;
58 void warn_relational_after_free (char *p, char *q[])
60 free (p);
62 int a[] =
64 p < q[0], // { dg-warning "pointer 'p' used" }
65 p <= q[1], // { dg-warning "pointer 'p' used" }
66 p > q[2], // { dg-warning "pointer 'p' used" }
67 p >= q[3], // { dg-warning "pointer 'p' used" }
68 p == q[4],
69 p != q[5]
72 sink (a);
75 void warn_cond_relational_after_free (char *p, char *q[], int c)
77 free (p);
79 int a[] =
81 c ? p < q[0] : q[0][0], // { dg-warning "pointer 'p' may be used" }
82 c ? p <= q[1] : q[1][1], // { dg-warning "pointer 'p' may be used" }
83 c ? p > q[2] : q[2][2], // { dg-warning "pointer 'p' may be used" }
84 c ? p >= q[3] : q[3][3], // { dg-warning "pointer 'p' may be used" }
85 c ? p == q[4] : q[4][4],
86 c ? p != q[5] : q[5][5],
89 sink (a);
93 // Verify warning for the example in the manual.
95 struct A { int refcount; void *data; };
97 void release (struct A *p)
99 int refcount = --p->refcount;
100 free (p);
101 if (refcount == 0)
102 free (p->data); // { dg-warning "pointer 'p' may be used" }