summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.old-deja/g++.other/cast6.C
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;
}