1 // { dg-do assemble  }
2 // Copyright (C) 2000 Free Software Foundation, Inc.
3 // Contributed by Nathan Sidwell 22 Nov 2000 <nathan@codesourcery.com>
4 
5 // bug 827. We died issuing warnings about dangerous pointer to member
6 // conversions.
7 
8 struct bar
9 {
10   int barm;
11     static void a();
12 };
13 struct filler1 {int fm;};
14 struct filler2 {int fm;};
15 struct filler3 {int fm;};
16 struct filler4 {int fm;};
17 
18 struct baz : filler1, bar, filler2
19 {
20   int bazm;
21 };
22 
23 struct foo : filler3, virtual baz, filler4
24 {
25     static void a();
bfoo26     void b() {}
27     int m;
28 };
29 
30 typedef void (bar::*barfPtr)();
31 typedef void (foo::*foofPtr)();
32 typedef int bar::*barmPtr;
33 typedef int foo::*foomPtr;
34 
main()35 int main ()
36 {
37   foofPtr fp = &foo::b;
38   barfPtr bp = (barfPtr)fp;         // { dg-error "pointer to member" }
39   foofPtr fp2 = (foofPtr)bp;        // { dg-error "pointer to member" }
40 
41   if (fp2 != fp)
42     return 1;
43 
44   foo fobj;
45   fobj.filler1::fm = 1;
46   fobj.filler2::fm = 2;
47   fobj.filler3::fm = 3;
48   fobj.filler4::fm = 4;
49   fobj.bazm = 5;
50   fobj.barm = 6;
51   fobj.m = 78;
52 
53   foomPtr fmp = &foo::m;
54   barmPtr bmp = (barmPtr)fmp;          // { dg-error "pointer to member" }
55   foomPtr fmp2 = (foomPtr)bmp;         // { dg-error "pointer to member" }
56   bar *bptr = &fobj;
57 
58   if (fmp != fmp2)
59     return 2;
60 
61   if (bptr->*bmp != 78)
62     return 3;
63 
64   bp = reinterpret_cast <barfPtr> (fp);
65   fp2 = reinterpret_cast <foofPtr> (bp);
66   if (fp2 != fp)
67     return 4;
68 
69   bmp = reinterpret_cast <barmPtr> (fmp);
70   fmp2 = reinterpret_cast <foomPtr> (bmp);
71   if (fmp != fmp2)
72     return 5;
73 
74   return 0;
75 }
76