blob: 05c7feef5c0f46e521973486961845d8f951f1df [file] [log] [blame]
/* Verify that passing a pointer to a deallocation function that was
previously passed to a mismatched reallocation function is diagnosed
by -Wmismatched-dealloc (and not by some other warning).
{ dg-do compile }
{ dg-options "-Wall" } */
#define A(...) __attribute__ ((malloc (__VA_ARGS__)))
typedef __SIZE_TYPE__ size_t;
extern "C"
{
void free (void *);
void* realloc (void *, size_t);
}
// User-defined allocator/deallocator just like like realloc.
int* int_realloc (size_t, int *);
A (int_realloc, 2) int* int_realloc (size_t, int *);
void sink (void *);
void* warn_realloc_op_delete (void *p)
{
void *q = realloc (p, 5); // { dg-message "call to 'void\\* realloc\\(void\\*, size_t\\)'" "note" }
operator delete (p); // { dg-warning "'void operator delete\\(void\\*\\)' called on pointer 'p' passed to mismatched allocation function 'void\\* realloc\\(void\\*, size_t\\)' \\\[-Wmismatched-dealloc" }
return q;
}
void* warn_realloc_op_delete_cond (void *p)
{
void *q = realloc (p, 5); // { dg-message "call to 'void\\* realloc\\(void\\*, size_t\\)'" "note" }
if (!q)
operator delete (p); // { dg-warning "'void operator delete\\(void\\*\\)' called on pointer 'p' passed to mismatched allocation function 'void\\* realloc\\(void\\*, size_t\\)'" }
return q;
}
void* warn_realloc_array_delete_char (char *p)
{
char *q;
q = (char*)realloc (p, 7); // { dg-message "call to 'void\\* realloc\\(void\\*, size_t\\)'" "note" }
if (!q)
delete[] (p); // { dg-warning "'void operator delete \\\[]\\(void\\*\\)' called on pointer 'p' passed to mismatched allocation function 'void\\* realloc\\(void\\*, size_t\\)'" }
return q;
}
int* warn_int_realloc_op_delete (int *p)
{
int *q;
q = int_realloc (5, p); // { dg-message "call to 'int\\* int_realloc\\(size_t, int\\*\\)'" "note" }
operator delete (p); // { dg-warning "'void operator delete\\(void\\*\\)' called on pointer 'p' passed to mismatched allocation function 'int\\* int_realloc\\(size_t, int\\*\\)' \\\[-Wmismatched-dealloc" }
return q;
}
int* warn_int_realloc_free (int *p)
{
int *q;
q = int_realloc (5, p); // { dg-message "call to 'int\\* int_realloc\\(size_t, int\\*\\)'" "note" }
free (p); // { dg-warning "'void free\\(void\\*\\)' called on pointer 'p' passed to mismatched allocation function 'int\\* int_realloc\\(size_t, int\\*\\)' \\\[-Wmismatched-dealloc" }
return q;
}