Daily bump.
[gcc.git] / gcc / testsuite / g++.dg / warn / Wmismatched-dealloc-2.C
blob3aea02fa63de86a5a24796c640338731995ceac9
1 /* PR middle-end/94527 - Add an attribute that marks a function as freeing
2    an object
3    The detection doesn't require optimization.
4    { dg-do compile }
5    { dg-options "-Wall" } */
7 #define A(...) __attribute__ ((malloc (__VA_ARGS__)))
9 typedef __SIZE_TYPE__ size_t;
11 extern "C" {
12   void free (void *);
13   void* realloc (void *, size_t);
16 void sink (void *);
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)
31 #endif
32 A (my_delete, 2)
33 int* my_new (size_t);
35 A ((OpDelete1*)operator delete[], 1)
36 #if __cplusplus >= 201402L
37 A ((OpDelete2*)operator delete[], 1)
38 #endif
39 A (my_array_delete, 2)
40 int* my_array_new (size_t);
43 void test_my_new ()
45   {
46     void *p = my_new (1);
47     operator delete (p);
48   }
49   {
50     void *p = my_new (1);
51     sink (p);
52     operator delete (p);
53   }
54   {
55     int *p = my_new (1);
56     sink (p);
57     delete p;
58   }
60   {
61     void *p = my_new (1);
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 }
65   }
66   {
67     void *p = my_new (1);
68     // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
69     sink (p);
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 }
72   }
73   {
74     int *p = my_new (1);
75     sink (p);
76     delete[] p;
77     // { dg-warning "'void operator delete \\\[]\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
78   }
80   {
81     void *p = my_new (1);
82     my_delete ("1", p);
83   }
84   {
85     void *p = my_new (1);
86     sink (p);
87     my_delete ("2", p);
88   }
90   {
91     void *p = my_new (1);
92     // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
93     sink (p);
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 }
96   }
98   {
99     void *p = my_new (1);
100     // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
101     sink (p);
102     free (p);
103     // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
104   }
106   {
107     void *p = my_new (1);
108     // { dg-message "returned from 'int\\\* my_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
109     sink (p);
110     p = realloc (p, 123);
111     // { dg-warning "'void\\\* realloc\\\(void\\\*, size_t\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
112   }
116 void test_my_array_new ()
118   {
119     void *p = my_array_new (1);
120     operator delete[] (p);
121   }
122   {
123     void *p = my_array_new (1);
124     sink (p);
125     operator delete[] (p);
126   }
127   {
128     int *p = my_array_new (1);
129     sink (p);
130     delete[] p;
131   }
133   {
134     void *p = my_array_new (1);
135     // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
136     operator delete (p);
137     // { dg-warning "'void operator delete\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
138   }
139   {
140     void *p = my_array_new (1);
141     // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
142     sink (p);
143     operator delete (p);
144     // { dg-warning "'void operator delete\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
145   }
146   {
147     int *p = my_array_new (1);
148     sink (p);
149     delete p;
150     // { dg-warning "'void operator delete\\\(void\\\*\[^\)\]*\\\)' called on pointer returned from a mismatched allocation function \\\[-Wmismatched-new-delete" "" { target *-*-* } .-1 }
151   }
153   {
154     void *p = my_array_new (1);
155     my_array_delete ("1", p);
156   }
157   {
158     void *p = my_array_new (1);
159     sink (p);
160     my_array_delete ("2", p);
161   }
162   {
163     void *p = my_array_new (1);
164     // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
165     sink (p);
166     my_delete ("3", p);
167     // { dg-warning "'void my_delete\\\(const char\\\*, void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
168   }
170   {
171     void *p = my_array_new (1);
172     // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
173     sink (p);
174     free (p);
175     // { dg-warning "'void free\\\(void\\\*\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
176   }
178   {
179     void *p = my_array_new (1);
180     // { dg-message "returned from 'int\\\* my_array_new\\\(size_t\\\)'" "note" { target *-*-* } .-1 }
181     sink (p);
182     p = realloc (p, 123);
183     // { dg-warning "'void\\\* realloc\\\(void\\\*, size_t\\\)' called on pointer returned from a mismatched allocation function" "" { target *-*-* } .-1 }
184   }