// { dg-do run }

// Copyright (C) 2002 Free Software Foundation, Inc.
// Contributed by Nathan Sidwell 27 Nov 2002 <nathan@codesourcery.com>

// covariant returns. Virtual offset.

struct B1;
struct B2;
struct D;

struct B1
{
  virtual B1 *foo1 () {return this;}
  virtual B2 *foo2 (D *);
};
struct B2
{
  virtual B2 *baz1 () {return this;}
  virtual B1 *baz2 (D *);
};

struct D : virtual B1, virtual B2
{
  virtual D *foo1 () {return this;}
  virtual D *foo2 (D *d) {return d;}
  virtual D *baz1 () {return this;}
  virtual D *baz2 (D *d) {return d;}
};

B2 *B1::foo2 (D *d) {return d;}
B1 *B2::baz2 (D *d) {return d;}

int test (B1 *b1, B2 *b2, D *d)
{
  if (b1->foo1 () != b1)
    return 1;
  if (b2->baz1 () != b2)
    return 2;
  if (b1->foo2 (d) != b2)
    return 3;
  if (b2->baz2 (d) != b1)
    return 4;
  return 0;
}

int test (D *d)
{
  if (d->foo2 (d) != d)
    return 11;
  if (d->baz2 (d) != d)
    return 12;
  if (d->foo1 () != d)
    return 13;
  if (d->baz1 () != d)
    return 14;
  return 0;
}

int main ()
{
  D d;
  int r;
  
  if ((r = test (&d, &d, &d)))
    return r;
  if ((r = test (&d)))
    return r;
  return 0;
}
