1 // { dg-do assemble } 2 3 // Copyright (C) 2000 Free Software Foundation, Inc. 4 // Contributed by Nathan Sidwell 28 Nov 2000 <nathan@codesourcery.com> 5 6 // We failed to reject static_cast and implicit conversions of pointers to 7 // member that traversed a virtual base. 8 9 struct bar 10 { 11 int barm; 12 static void a(); 13 }; 14 struct filler1 {int fm;}; 15 struct filler2 {int fm;}; 16 struct filler3 {int fm;}; 17 struct filler4 {int fm;}; 18 19 struct baz : filler1, bar, filler2 20 { 21 int bazm; 22 }; 23 24 struct foo : filler3, virtual baz, filler4 25 { 26 static void a(); bfoo27 void b() {} 28 int m; 29 }; 30 31 typedef void (bar::*barfPtr)(); 32 typedef void (foo::*foofPtr)(); 33 typedef int bar::*barmPtr; 34 typedef int foo::*foomPtr; 35 36 struct X; 37 typedef void (X::*xfPtr) (); 38 typedef int X::*xmPtr; 39 main()40int main () 41 { 42 { 43 foofPtr fp = &foo::b; 44 barfPtr bp = static_cast <barfPtr> (fp); // { dg-error "via virtual base" } invalid static_cast 45 foofPtr fp2 = static_cast <foofPtr> (bp); // { dg-error "via virtual base" } invalid static_cast 46 foofPtr fp3 = bp; // { dg-error "via virtual base" } cannot convert 47 fp3 = (foofPtr)bp; // { dg-error "via virtual base" } via virtual base 48 49 foomPtr fmp = &foo::m; 50 barmPtr bmp = static_cast <barmPtr> (fmp); // { dg-error "via virtual base" } invalid static_cast 51 foomPtr fmp2 = static_cast <foomPtr> (bmp); // { dg-error "via virtual base" } invalid static_cast 52 foomPtr fmp3 = bmp; // { dg-error "via virtual base" } cannot convert 53 fmp3 = (foomPtr)bmp; // { dg-error "via virtual base" } via virtual base 54 } 55 56 return 0; 57 } 58