| #include <stdio.h> |
| |
| // PR c++/15097 |
| // { dg-do run } |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| extern "C" void * malloc (size_t); |
| extern "C" void free (void *); |
| extern "C" void abort(void); |
| |
| void *saved; |
| |
| void * operator new (size_t size) |
| { |
| void *p = malloc (size); |
| saved = p; |
| return p; |
| } |
| |
| void operator delete (void *p) |
| { |
| // Note that since STL is built w/o -Bsymbolic a lots of other code in STL |
| // may use the customized new/delete in this file. We only save one copy of |
| // poitner in variable "saved", but because this testcase new and immediately |
| // delete in single thread, this single-copy serves well, provided that we only |
| // check saved==p once and set saved to NULL to prevent further comparison of |
| // unrelated delete from within STL |
| if (saved) { |
| if (p == saved) { |
| saved = NULL; |
| } else { |
| abort (); |
| } |
| } |
| |
| free (p); |
| } |
| |
| struct B1 |
| { |
| virtual ~B1 () throw() {} |
| B1 (){} |
| int x; |
| }; |
| struct B2 |
| { |
| virtual ~B2 () throw() {} |
| B2 (){} |
| int x; |
| }; |
| struct D : B1, B2 |
| { |
| D (){} |
| ~D () throw() {} |
| int y; |
| }; |
| void f1 (D*); |
| void f2 (B2*); |
| void f3 (B1*); |
| int main (void) |
| { |
| f1 (::new D); |
| f2 (::new D); |
| f3 (::new D); |
| } |
| void f1 ( D* p) { ::delete p; } |
| void f2 (B2* p) { ::delete p; } |
| void f3 (B1* p) { ::delete p; } |