// { dg-do assemble }
|
// { dg-do assemble }
|
// Copyright (C) 2000 Free Software Foundation, Inc.
|
// Copyright (C) 2000 Free Software Foundation, Inc.
|
// Contributed by Nathan Sidwell 22 Nov 2000
|
// Contributed by Nathan Sidwell 22 Nov 2000
|
|
|
// bug 827. We died issuing warnings about dangerous pointer to member
|
// bug 827. We died issuing warnings about dangerous pointer to member
|
// conversions.
|
// conversions.
|
|
|
struct bar
|
struct bar
|
{
|
{
|
int barm;
|
int barm;
|
static void a();
|
static void a();
|
};
|
};
|
struct filler1 {int fm;};
|
struct filler1 {int fm;};
|
struct filler2 {int fm;};
|
struct filler2 {int fm;};
|
struct filler3 {int fm;};
|
struct filler3 {int fm;};
|
struct filler4 {int fm;};
|
struct filler4 {int fm;};
|
|
|
struct baz : filler1, bar, filler2
|
struct baz : filler1, bar, filler2
|
{
|
{
|
int bazm;
|
int bazm;
|
};
|
};
|
|
|
struct foo : filler3, virtual baz, filler4
|
struct foo : filler3, virtual baz, filler4
|
{
|
{
|
static void a();
|
static void a();
|
void b() {}
|
void b() {}
|
int m;
|
int m;
|
};
|
};
|
|
|
typedef void (bar::*barfPtr)();
|
typedef void (bar::*barfPtr)();
|
typedef void (foo::*foofPtr)();
|
typedef void (foo::*foofPtr)();
|
typedef int bar::*barmPtr;
|
typedef int bar::*barmPtr;
|
typedef int foo::*foomPtr;
|
typedef int foo::*foomPtr;
|
|
|
int main ()
|
int main ()
|
{
|
{
|
foofPtr fp = &foo::b;
|
foofPtr fp = &foo::b;
|
barfPtr bp = (barfPtr)fp; // { dg-error "pointer to member" }
|
barfPtr bp = (barfPtr)fp; // { dg-error "pointer to member" }
|
foofPtr fp2 = (foofPtr)bp; // { dg-error "pointer to member" }
|
foofPtr fp2 = (foofPtr)bp; // { dg-error "pointer to member" }
|
|
|
if (fp2 != fp)
|
if (fp2 != fp)
|
return 1;
|
return 1;
|
|
|
foo fobj;
|
foo fobj;
|
fobj.filler1::fm = 1;
|
fobj.filler1::fm = 1;
|
fobj.filler2::fm = 2;
|
fobj.filler2::fm = 2;
|
fobj.filler3::fm = 3;
|
fobj.filler3::fm = 3;
|
fobj.filler4::fm = 4;
|
fobj.filler4::fm = 4;
|
fobj.bazm = 5;
|
fobj.bazm = 5;
|
fobj.barm = 6;
|
fobj.barm = 6;
|
fobj.m = 78;
|
fobj.m = 78;
|
|
|
foomPtr fmp = &foo::m;
|
foomPtr fmp = &foo::m;
|
barmPtr bmp = (barmPtr)fmp; // { dg-error "pointer to member" }
|
barmPtr bmp = (barmPtr)fmp; // { dg-error "pointer to member" }
|
foomPtr fmp2 = (foomPtr)bmp; // { dg-error "pointer to member" }
|
foomPtr fmp2 = (foomPtr)bmp; // { dg-error "pointer to member" }
|
bar *bptr = &fobj;
|
bar *bptr = &fobj;
|
|
|
if (fmp != fmp2)
|
if (fmp != fmp2)
|
return 2;
|
return 2;
|
|
|
if (bptr->*bmp != 78)
|
if (bptr->*bmp != 78)
|
return 3;
|
return 3;
|
|
|
bp = reinterpret_cast (fp);
|
bp = reinterpret_cast (fp);
|
fp2 = reinterpret_cast (bp);
|
fp2 = reinterpret_cast (bp);
|
if (fp2 != fp)
|
if (fp2 != fp)
|
return 4;
|
return 4;
|
|
|
bmp = reinterpret_cast (fmp);
|
bmp = reinterpret_cast (fmp);
|
fmp2 = reinterpret_cast (bmp);
|
fmp2 = reinterpret_cast (bmp);
|
if (fmp != fmp2)
|
if (fmp != fmp2)
|
return 5;
|
return 5;
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|