Daily bump.
[gcc.git] / gcc / testsuite / g++.dg / warn / Wmismatched-new-delete.C
blobfc07149995de4bc6671310d204cc351013922926
1 /* PR c++/90629 - Support for -Wmismatched-new-delete
2    The detection doesn't require optimization.
3    { dg-do compile }
4    { dg-options "-Wall" } */
6 typedef __SIZE_TYPE__ size_t;
8 extern "C" {
9   void free (void *);
10   void* malloc (size_t);
11   void* realloc (void *, size_t);
12   char* strdup (const char *);
13   char* strndup (const char *, size_t);
16 void sink (void *);
18 void nowarn_op_new_delete (int n)
20   void *p = operator new (n);
21   sink (p);
22   operator delete (p);
25 void nowarn_new_delete (int n)
27   {
28     char *p = new char;
29     sink (p);
30     delete p;
31   }
33   {
34     char *p = new char[n];
35     sink (p);
36     delete[] p;
37   }
40 /* Verify a warning for calls to free() with a pointer returned from
41    a call to operator new() or the new expressopm.  */
43 void warn_new_free (int n)
45   {
46     void *p = operator new (n);
47     // { dg-message "returned from 'void\\\* operator new\\\(" "note" { target *-*-* } .-1 }
48     sink (p);
49     free (p);
50     // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
51   }
52   {
53     char *p = new char[n];
54     // { dg-message "returned from 'void\\\* operator new \\\[" "note" { target *-*-* } .-1 }
55     sink (p);
56     free (p);
57     // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
58   }
62 /* Verify a warning for calls to realloc() with a pointer returned from
63    a call to operator new() or the new expressopm.  */
65 void warn_new_realloc (int n)
67   {
68     void *p = operator new (n);
69     // { dg-message "returned from 'void\\\* operator new\\\(" "note" { target *-*-* } .-1 }
70     sink (p);
71     p = realloc (p, n * 2);
72     // { dg-warning "'void\\\* realloc\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
73     sink (p);
74   }
75   {
76     void *p = new char[n];
77     // { dg-message "returned from 'void\\\* operator new \\\[" "note" { target *-*-* } .-1 }
78     sink (p);
79     p = realloc (p, n * 2);
80     // { dg-warning "'void\\\* realloc\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
81     sink (p);
82   }
86 /* Verify a warning for a call to operator_delete() with a pointer returned
87    from a call to malloc().  */
89 void warn_malloc_op_delete (int n)
91   char *p = (char *)malloc (n);
92   // { dg-message "returned from 'void\\\* malloc\\\(" "note" { target *-*-* } .-1 }
93   sink (p);
94   operator delete (p);
95   // { dg-warning "'void operator delete\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
99 /* Verify a warning for an invocation of either form of the delete
100    expression with a pointer returned from malloc().  */
102 void warn_malloc_delete (int n)
104   {
105     char *p = (char *)malloc (n);
106     // { dg-message "returned from 'void\\\* malloc\\\(" "note" { target *-*-* } .-1 }
107     sink (p);
108     /* C++98 calls operator delete (void*) but later versions call
109        operator delete (void*, size_t).  The difference doesn't matter
110        here so verify just that some operator delete is called.  */
111     delete p;
112     // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
113   }
115   {
116     char *p = (char *)malloc (n);
117     // { dg-message "returned from 'void\\\* malloc\\\(" "note" { target *-*-* } .-1 }
118     sink (p);
119     delete[] p;
120     // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
121   }
125 /* Verify a warning for an invocation of either form of the delete
126    expression with a pointer returned from realloc().  */
128 void warn_realloc_delete (void *p1, void *p2, int n)
130   {
131     char *q = (char *)realloc (p1, n);
132     // { dg-message "returned from 'void\\\* realloc\\\(" "note" { target *-*-* } .-1 }
133     sink (q);
134     /* C++98 calls operator delete (void*) but later versions call
135        operator delete (void*, size_t).  The difference doesn't matter
136        here so verify just that some operator delete is called.  */
137     delete q;
138     // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
139   }
141   {
142     char *q = (char *)realloc (p2, n);
143     // { dg-message "returned from 'void\\\* realloc\\\(" "note" { target *-*-* } .-1 }
144     sink (q);
145     delete[] q;
146     // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
147   }
151 /* Verify a warning for an invocation of either form of the delete
152    expression with a pointer returned from strdup().  */
154 void warn_strdup_delete (const char *s1, const char *s2)
156   {
157     char *q = strdup (s1);
158     // { dg-message "returned from 'char\\\* strdup\\\(" "note" { target *-*-* } .-1 }
159     sink (q);
160     /* C++98 calls operator delete (void*) but later versions call
161        operator delete (void*, size_t).  The difference doesn't matter
162        here so verify just that some operator delete is called.  */
163     delete q;
164     // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
165   }
167   {
168     char *q = strdup (s2);
169     // { dg-message "returned from 'char\\\* strdup\\\(" "note" { target *-*-* } .-1 }
170     sink (q);
171     delete[] q;
172     // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
173   }
178 /* Verify a warning for an invocation of either form of the delete
179    expression with a pointer returned from strndup().  */
181 void warn_strdup_delete (const char *s1, const char *s2, size_t n)
183   {
184     char *q = strndup (s1, n);
185     // { dg-message "returned from 'char\\\* strndup\\\(" "note" { target *-*-* } .-1 }
186     sink (q);
187     /* C++98 calls operator delete (void*) but later versions call
188        operator delete (void*, size_t).  The difference doesn't matter
189        here so verify just that some operator delete is called.  */
190     delete q;
191     // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
192   }
194   {
195     char *q = strndup (s2, n);
196     // { dg-message "returned from 'char\\\* strndup\\\(" "note" { target *-*-* } .-1 }
197     sink (q);
198     delete[] q;
199     // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
200   }
204 struct Base { virtual ~Base (); };
205 struct Derived: Base { };
207 void warn_new_free_base_derived ()
209   Base *p = new Derived ();
210   sink (p);
211   free (p);                   // { dg-warning "\\\[-Wmismatched-new-delete" }