// { dg-do assemble  }

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

// We failed to reject static_cast and implicit conversions of pointers to
// member that traversed a virtual base.

struct bar
{
  int barm;
    static void a();
};
struct filler1 {int fm;};
struct filler2 {int fm;};
struct filler3 {int fm;};
struct filler4 {int fm;};

struct baz : filler1, bar, filler2
{
  int bazm;
};

struct foo : filler3, virtual baz, filler4
{
    static void a();
    void b() {};
    int m;
};

typedef void (bar::*barfPtr)();
typedef void (foo::*foofPtr)();
typedef int bar::*barmPtr;
typedef int foo::*foomPtr;

struct X;
typedef void (X::*xfPtr) ();
typedef int X::*xmPtr;

int main ()
{
  {
    foofPtr fp = &foo::b;
    barfPtr bp = static_cast <barfPtr> (fp);    // { dg-error "" } invalid static_cast
    foofPtr fp2 = static_cast <foofPtr> (bp);   // { dg-error "" } invalid static_cast
    foofPtr fp3 = bp;                           // { dg-error "" } cannot convert
    fp3 = (foofPtr)bp;                          // { dg-warning "" } via virtual base
    
    foomPtr fmp = &foo::m;
    barmPtr bmp = static_cast <barmPtr> (fmp);  // { dg-error "" } invalid static_cast
    foomPtr fmp2 = static_cast <foomPtr> (bmp); // { dg-error "" } invalid static_cast
    foomPtr fmp3 = bmp;                         // { dg-error "" } cannot convert
    fmp3 = (foomPtr)bmp;                        // { dg-warning "" } via virtual base
  }
  
  return 0;
}
