i386: Utilize VCOMSBF16 for BF16 Comparisons with AVX10.2
[official-gcc.git] / gcc / testsuite / g++.dg / warn / Wuse-after-free.C
blob022bd8d39f95682ce7ada9499d44b239a7371a28
1 /* Exercise basic C++ only cases of -Wuse-after-free without optimization.
2    { dg-do compile }
3    { dg-options "-O0 -Wall" } */
5 typedef __SIZE_TYPE__ size_t;
7 extern "C" void free (void *);
8 extern "C" void* realloc (void *, size_t);
10 void sink (void *);
12 extern void* evp;
13 extern void* evpa[];
15 extern int ei;
17 struct List { struct List *next; };
19 void nowarn_delete (void *vp, struct List *lp)
21   {
22     operator delete (vp);
23     vp = 0;
24     sink (vp);
25   }
26   {
27     operator delete (evp);
28     evp = 0;
29     sink (evp);
30   }
31   {
32     operator delete (evpa[0]);
33     evpa[0] = 0;
34     sink (evpa[0]);
35   }
36   {
37     void *vp = evpa[0];
38     operator delete (evpa[0]);
39     sink (vp);
40   }
41   {
42     void *p = evpa[1];
43     if (ei & 1)
44       operator delete (p);
45     if (ei & 2)
46       sink (p);
47   }
48   {
49     struct List *next = lp->next;
50     operator delete (lp);
51     operator delete (next);
52   }
55 void nowarn_delete_arg (void *p, void *q)
57   operator delete (p);
58   if (q)
59     operator delete (q);
62 void nowarn_delete_extern (void)
64   extern void *ep, *eq;
65   operator delete (ep);
66   ep = eq;
67   operator delete (ep);
70 void nowarn_delete_assign (void)
72   extern void *ep;
73   operator delete (ep);
74   ep = 0;
75   operator delete (ep);
78 void warn_double_delete_arg (void *p)
80   operator delete (p);        // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
81   operator delete (p);        // { dg-warning "\\\-Wuse-after-free" }
84 void warn_delete_free_arg (void *p)
86   operator delete (p);        // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
87   free (p);                   // { dg-warning "\\\-Wuse-after-free" }
90 void warn_free_delete_arg (void *p)
92   free (p);                   // { dg-message "call to 'void free\\(void\\*\\)'" "note" }
93   operator delete (p);        // { dg-warning "\\\-Wuse-after-free" }
96 void warn_mismatched_double_delete_arg (void *p, void *q)
98   operator delete (p);        // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
99   operator delete[] (p);      // { dg-warning "\\\-Wuse-after-free" }
101   operator delete[] (q);      // { dg-message "call to 'void operator delete \\\[]\\(void\\*\\)'" "note" }
102   operator delete (q);        // { dg-warning "\\\-Wuse-after-free" }
105 void warn_double_delete_extern (void)
107   /* GCC assumes operator delete() clobbers global memory and the warning is
108      too simplistic to see through that assumption.  */
109   extern void *ep, *eq;
110   {
111     eq = ep;
112     operator delete (ep);     // { dg-message "call to 'operator delete'" "pr??????" { xfail *-*-* } }
113     operator delete (eq);     // { dg-warning "\\\-Wuse-after-free" "pr??????" { xfail *-*-* } }
114   }
117 void warn_deref_after_delete (int *p, int i)
119   int *q0 = p, *q1 = p + 1, *qi = p + i;
120   operator delete (p);        // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
121   *p = 0;                     // { dg-warning "\\\-Wuse-after-free" }
123   *q0 = 0;                    // { dg-warning "\\\-Wuse-after-free" }
124   *q1 = 0;                    // { dg-warning "\\\-Wuse-after-free" }
125   *qi = 0;                    // { dg-warning "\\\-Wuse-after-free" }
128 void warn_array_ref_after_delete (int *p, int i)
130   operator delete (p);        // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
131   p[i] = 0;                   // { dg-warning "\\\-Wuse-after-free" }
134 void nowarn_delete_list (struct List *head)
136   for (struct List *p = head, *q; p; p = q)
137     {
138       q = p->next;
139       operator delete (p);
140     }
143 void warn_delete_list (struct List *head)
145   struct List *p = head;
146   for (; p; p = p->next)      // { dg-warning "\\\[-Wuse-after-free" }
147     operator delete (p);      // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
150 void warn_delete (void *vp)
152   {
153     operator delete (vp);     // { dg-message "call to 'void operator delete\\(void\\*\\)'" "note" }
154     evp = vp;                 // { dg-warning "-Wuse-after-free" }
155     evpa[0] = vp;             // { dg-warning "-Wuse-after-free" }
156     evpa[1] = evp;
157   }