blob: 4bf90fab52c77e8201c3331726d110b9497ce90b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
// { 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 "via virtual base" } invalid static_cast
foofPtr fp2 = static_cast <foofPtr> (bp); // { dg-error "via virtual base" } invalid static_cast
foofPtr fp3 = bp; // { dg-error "via virtual base" } cannot convert
fp3 = (foofPtr)bp; // { dg-error "via virtual base" } via virtual base
foomPtr fmp = &foo::m;
barmPtr bmp = static_cast <barmPtr> (fmp); // { dg-error "via virtual base" } invalid static_cast
foomPtr fmp2 = static_cast <foomPtr> (bmp); // { dg-error "via virtual base" } invalid static_cast
foomPtr fmp3 = bmp; // { dg-error "via virtual base" } cannot convert
fmp3 = (foomPtr)bmp; // { dg-error "via virtual base" } via virtual base
}
return 0;
}
|