1 // { dg-do run  }
2 // GROUPS passed vtable
3 extern "C" int printf (const char *, ...);
4 extern "C" void exit(int);
5 
6 class A {
7 public:
f1()8   virtual const char* f1() { return "A::f1"; }
f2()9   virtual const char* f2() { return "A::f2"; }
f3()10   virtual const char* f3() { printf("FAIL\n"); exit(1); return "A::f3"; }
11 };
12 
13 class B {
14 public:
f2()15   virtual const char* f2() { return "B::f2"; }
f3()16   virtual const char* f3() { return "B::f3"; }
17 };
18 
19 class C: public A, public B {
20 public:
f2()21   const char* f2() { return B::f2(); }
f1()22   const char* f1() { return f2(); }
f3()23   const char* f3() { return A::f3(); }
24 };
25 
26 class D: public A, public B {
27 public:
f2()28   const char* f2() { return B::f2(); }
f1()29   const char* f1() { return D :: f2(); }
f3()30   const char* f3() { return A::f3(); }
31 };
32 
main()33 int main() {
34   C* tempC = new C;
35   D* tempD = new D;
36   A* a = tempC;
37   printf("calling f1 on a C gives %s\n", a->f1());
38   a = tempD;
39   printf("calling f1 on a D gives %s\n", a->f1());
40   printf("PASS\n");
41   return 0;
42 }
43