| // { dg-do run { xfail sparc64-*-elf arm-*-pe } } |
| // { dg-options "-fexceptions" } |
| |
| class VB { |
| public: |
| int n; |
| VB (int v) { n = v; } |
| VB (const VB& o) { |
| n = o.n; |
| // printf("copying VB from %d to %d\n", &o, this); |
| } |
| }; |
| |
| class D : public virtual VB { |
| int j; |
| public: |
| D(int i1, int i2) : VB(i2) { j = i1; } |
| VB& vb() { return *(VB*)this; } |
| const VB& vb() const { return *(const VB*)this; } |
| }; |
| |
| class pD : private virtual VB { |
| int j; |
| public: |
| pD(int i1, int i2) : VB(i2) { j = i1; } |
| VB& vb() { return *(VB*)this; } |
| const VB& vb() const { return *(const VB*)this; } |
| }; |
| |
| |
| int main () { |
| D d(1943, 4279); |
| pD pd(3621, 9527); |
| VB *vb = &d.vb(); |
| VB *pvb = &pd.vb(); |
| |
| // A catch of a public virtual base. |
| try { |
| // printf("Throwing D at %d (VB at %d)\n", &d, vb); |
| throw d; |
| } |
| catch (VB& vb) { |
| // printf("Catching VB at %d\n", &vb); |
| if (vb.n != 4279) |
| return 1; |
| } |
| catch (...) { |
| return 1; |
| } |
| |
| // A catch of a private virtual base. |
| try { |
| // printf("Throwing D at %d (VB at %d)\n", &pd, pvb); |
| throw pd; |
| } |
| catch (VB& vb) { |
| // printf("Catching VB at %d\n", &vb); |
| // This was a private base of the throw object, don't catch it. |
| return 1; |
| } |
| catch (...) { |
| } |
| } |