// Check that indirect calls to thunks do not lead to errors.
// { dg-do run }
// { dg-options "-O -finline -finline-small-functions -finline-functions" }


extern "C" void abort ();

class A
{
public:
  virtual void foo () {abort();}
};

class B : public A
{
public:
  int z;
  virtual void foo () {abort();}
};

class C : public A
{
public:
  void *a[32];
  unsigned long b;
  long c[32];

  virtual void foo () {abort();}
};

class D : public C, public B
{
public:
  D () : C(), B()
  {
    int i;
    for (i = 0; i < 32; i++)
      {
	a[i] = (void *) 0;
	c[i] = 0;
      }
    b = 0xaaaa;
  }

  virtual void foo ();
};

void D::foo()
{
  if (b != 0xaaaa)
    abort();
}

static inline void bar (B &b)
{

  b.foo ();
}

int main()
{
  int i;
  D d;

  for (i = 0; i < 5000; i++)
    bar (d);
  return 0;
}
