/* 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; }