1 /* PR middle-end/94527 - Add an attribute that marks a function as freeing
3 The detection doesn't require optimization.
5 { dg-options "-Wall" } */
7 #define A(...) __attribute__ ((malloc (__VA_ARGS__)))
9 typedef __SIZE_TYPE__ size_t;
13 void* realloc (void *, size_t);
18 void mydealloc (int, void*);
19 void* A (mydealloc, 2) myalloc (void*);
22 void my_delete (const char*, void*);
23 void my_array_delete (const char*, void*);
25 typedef void OpDelete1 (void*);
26 typedef void OpDelete2 (void*, size_t);
28 A ((OpDelete1*)operator delete, 1)
29 #if __cplusplus >= 201402L
30 A ((OpDelete2*)operator delete, 1)
35 A ((OpDelete1*)operator delete[], 1)
36 #if __cplusplus >= 201402L
37 A ((OpDelete2*)operator delete[], 1)
39 A (my_array_delete, 2)
40 int* my_array_new (size_t);
62 // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
63 operator delete[] (p);
64 // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
68 // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
70 operator delete[] (p);
71 // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
77 // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
92 // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
94 my_array_delete ("3", p);
95 // { dg-warning "'void my_array_delete\\\(const char\\\*, void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
100 // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
103 // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
107 void *p = my_new (1);
108 // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
110 p = realloc (p, 123);
111 // { dg-warning "'void\\\* realloc\\\(void\\\*, size_t\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
116 void test_my_array_new ()
119 void *p = my_array_new (1);
120 operator delete[] (p);
123 void *p = my_array_new (1);
125 operator delete[] (p);
128 int *p = my_array_new (1);
134 void *p = my_array_new (1);
135 // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
137 // { dg-warning "'void operator delete\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
140 void *p = my_array_new (1);
141 // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
144 // { dg-warning "'void operator delete\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
147 int *p = my_array_new (1);
150 // { dg-warning "'void operator delete\\\(void\\\*\[^\)\]*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
154 void *p = my_array_new (1);
155 my_array_delete ("1", p);
158 void *p = my_array_new (1);
160 my_array_delete ("2", p);
163 void *p = my_array_new (1);
164 // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
167 // { dg-warning "'void my_delete\\\(const char\\\*, void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
171 void *p = my_array_new (1);
172 // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
175 // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
179 void *p = my_array_new (1);
180 // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
182 p = realloc (p, 123);
183 // { dg-warning "'void\\\* realloc\\\(void\\\*, size_t\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }