1 /* PR c++/90629 - Support for -Wmismatched-new-delete
2 The detection doesn't require optimization.
4 { dg-options "-Wall" } */
6 typedef __SIZE_TYPE__ size_t;
10 void* malloc (size_t);
11 void* realloc (void *, size_t);
12 char* strdup (const char *);
13 char* strndup (const char *, size_t);
18 void nowarn_op_new_delete (int n)
20 void *p = operator new (n);
25 void nowarn_new_delete (int n)
34 char *p = new char[n];
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)
46 void *p = operator new (n);
47 // { dg-message "returned from 'void\\\* operator new\\\(" "note" { target *-*-* } .-1 }
50 // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
53 char *p = new char[n];
54 // { dg-message "returned from 'void\\\* operator new \\\[" "note" { target *-*-* } .-1 }
57 // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
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)
68 void *p = operator new (n);
69 // { dg-message "returned from 'void\\\* operator new\\\(" "note" { target *-*-* } .-1 }
71 p = realloc (p, n * 2);
72 // { dg-warning "'void\\\* realloc\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
76 void *p = new char[n];
77 // { dg-message "returned from 'void\\\* operator new \\\[" "note" { target *-*-* } .-1 }
79 p = realloc (p, n * 2);
80 // { dg-warning "'void\\\* realloc\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
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 }
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)
105 char *p = (char *)malloc (n);
106 // { dg-message "returned from 'void\\\* malloc\\\(" "note" { target *-*-* } .-1 }
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. */
112 // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
116 char *p = (char *)malloc (n);
117 // { dg-message "returned from 'void\\\* malloc\\\(" "note" { target *-*-* } .-1 }
120 // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
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)
131 char *q = (char *)realloc (p1, n);
132 // { dg-message "returned from 'void\\\* realloc\\\(" "note" { target *-*-* } .-1 }
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. */
138 // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
142 char *q = (char *)realloc (p2, n);
143 // { dg-message "returned from 'void\\\* realloc\\\(" "note" { target *-*-* } .-1 }
146 // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
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)
157 char *q = strdup (s1);
158 // { dg-message "returned from 'char\\\* strdup\\\(" "note" { target *-*-* } .-1 }
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. */
164 // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
168 char *q = strdup (s2);
169 // { dg-message "returned from 'char\\\* strdup\\\(" "note" { target *-*-* } .-1 }
172 // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
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)
184 char *q = strndup (s1, n);
185 // { dg-message "returned from 'char\\\* strndup\\\(" "note" { target *-*-* } .-1 }
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. */
191 // { dg-warning "'void operator delete\\\(\[^)\]+\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
195 char *q = strndup (s2, n);
196 // { dg-message "returned from 'char\\\* strndup\\\(" "note" { target *-*-* } .-1 }
199 // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
204 struct Base { virtual ~Base (); };
205 struct Derived: Base { };
207 void warn_new_free_base_derived ()
209 Base *p = new Derived ();
211 free (p); // { dg-warning "\\\[-Wmismatched-new-delete" }