Daily bump.
[gcc.git] / gcc / testsuite / g++.dg / warn / Wfree-nonheap-object.C
blob82b081ad48f7ca0c03594672470f2c001bf0bb35
1 /* PR ????? - No warning on attempts to access free object
2    Verify that attempts to deallocate objects by pointers with nonzero
3    offsets is diagnosed.
4    { dg-do compile }
5    { dg-options "-O2 -Wall -Wfree-nonheap-object" }  */
7 typedef __INTPTR_TYPE__ intptr_t;
8 typedef __SIZE_TYPE__   size_t;
10 void sink (void*, ...);
12 extern char ecarr[];
13 extern void* eparr[];
15 extern char *eptr;
17 char* source (void);
19 void nowarn_op_delete (void *p, void ***ppp, size_t n, intptr_t iptr)
21   operator delete (p);
23   p = 0;
24   operator delete (p);
26   p = operator new (n);
27   sink (p);
28   operator delete (p);
30   p = operator new (n);
31   sink (p);
33   operator delete ((void*)iptr);
35   p = source ();
36   operator delete (p);
38   p = source ();
39   p = (char*)p - 1;
40   operator delete (p);
42   operator delete (**ppp);
43   operator delete (*ppp);
44   operator delete (ppp);
47 void warn_op_delete_cstaddr (void *p)
49   operator delete (p);
50   p = (void*)~0;
51   operator delete (p);        // { dg-warning "called on a pointer to an unallocated object" } */
54 void warn_op_delete_funcaddr ()
56   void *p = (void*)&warn_op_delete_funcaddr;
57   operator delete (p);        // { dg-warning "called on unallocated object 'void warn_op_delete_funcaddr()" } */
60 void warn_op_delete_string (void *p)
62   operator delete (p);
63   p = (void*)"";
64   operator delete (p);        // { dg-warning "called on a pointer to an unallocated object" } */
67 void warn_op_delete_ptr_to_self (void *p)
69   operator delete (p);
70   p = &p;
71   operator delete (p);        // { dg-warning "called on unallocated object 'p'" } */
74 void nowarn_op_new_delete (size_t n)
76   void *p = operator new (n);
77   sink (p);
78   operator delete (p);
81 void nowarn_op_new_delete_ptr_plus (size_t n)
83   void *p0_1 = operator new (n);
84   void *p1 = (char*)p0_1 + 1;
85   sink (p0_1, p1);
86   void *p0_2 = (char*)p1 - 1;
87   sink (p0_1, p1, p0_2);
88   operator delete (p0_2);
91 void warn_op_new_delete_cstoff (size_t n)
93   void *p = operator new (n);
94   void *q = (char*)p + 1;
95   sink (p, q);
96   operator delete (q);        // { dg-warning "'void operator delete\\\(void\\\*\\\)' called on pointer '\[^'\]+' with nonzero offset 1" }
99 void warn_op_new_delete_ptr_plus (size_t n)
101   char *p = (char*)operator new (n);
102   sink (++p);
103   operator delete (p);        // { dg-warning "called on pointer '\[^']+' with nonzero offset 1" }
106 void warn_op_delete_funcret_plus (size_t n)
108   char *p = source ();
109   sink (++p);
110   operator delete (p);        // { dg-warning "called on pointer '\[^']+' with nonzero offset 1" }
113 void warn_op_delete_eptr_plus (int i)
115   extern char *ecp;
117   if (i < 1)
118     i = 1;
120   char *p = ecp + i;
121   sink (p);
123   operator delete (p);        // { dg-warning "called on pointer '\[^']+' with nonzero offset \\\[1, \\d+]" }