// { dg-do run  }
// check MI and VBC offsets on throw
extern "C" void abort ();
extern "C" void exit (int);

struct A {
    int x[23];
};

struct B : virtual public A {
    int y[33];
};

struct C : virtual public A, public B {
    int z[43];
};

struct D {
    int xx[53];
};

struct E : public D, public A {
    int yy[63];
};

C c;

E e;

void f1()
{
    throw (C*)0;
}

void f2()
{
    throw &c;
}

void f3()
{
    throw (E*)0;
}

void f4()
{
    throw &e;
}

int main()
{
    int flag;

    flag = 0;
    try {
        f1();
    }
    catch (A* p) {
        if (p)
            abort();
        flag = 1;
    }
    if (!flag)
        abort();

    flag = 0;
    try {
        f2();
    }
    catch (A* p) {
        if (!p || (void*)p == (void*)&c)
            abort();
        flag = 1;
    }
    if (!flag)
        abort();

    flag = 0;
    try {
        f3();
    }
    catch (A* p) {
        if (p)
            abort();
        flag = 1;
    }
    if (!flag)
        abort();

    flag = 0;
    try {
        f4();
    }
    catch (A* p) {
        if (!p || (void*)p == (void*)&e)
            abort();
        flag = 1;
    }
    if (!flag)
        abort();

    exit(0);
}