| // PR c++/4460 |
| // Test that the cleanup for fully-constructed subobjects when a |
| // constructor throws gets the right address for a virtual base. |
| |
| // { dg-do run } |
| |
| int r; |
| void *p; |
| |
| struct VBase |
| { |
| virtual void f () {} |
| VBase() { p = this; } |
| ~VBase() { if (p != this) r = 1; } |
| }; |
| |
| struct StreamBase |
| { |
| virtual ~StreamBase() {} |
| }; |
| |
| struct Stream : public virtual VBase, public StreamBase |
| { |
| Stream() {} |
| virtual ~Stream() {} |
| }; |
| |
| struct DerivedStream : public Stream |
| { |
| DerivedStream() { throw 1; } |
| }; |
| |
| int main() { |
| |
| try |
| { |
| DerivedStream str; |
| } |
| catch (...) { } |
| |
| return r; |
| } |