1*66e63ce3Schristos // This first batch of classes are for PR 11226.
2*66e63ce3Schristos namespace mc {
3*66e63ce3Schristos   class Base {
4*66e63ce3Schristos   protected:
5*66e63ce3Schristos     int x;
6*66e63ce3Schristos 
7*66e63ce3Schristos   public:
Base(void)8*66e63ce3Schristos     Base(void) { x = 2; };
9*66e63ce3Schristos   };
10*66e63ce3Schristos }
11*66e63ce3Schristos 
12*66e63ce3Schristos namespace ph {
13*66e63ce3Schristos   class Middle: public virtual mc::Base {
14*66e63ce3Schristos   protected:
15*66e63ce3Schristos     int y;
16*66e63ce3Schristos 
17*66e63ce3Schristos   public:
Middle(void)18*66e63ce3Schristos     Middle(void): mc::Base() { y = 3; };
19*66e63ce3Schristos 
get_y(void)20*66e63ce3Schristos     int get_y(void)
21*66e63ce3Schristos     {
22*66e63ce3Schristos       return y;			// breakpoint 1
23*66e63ce3Schristos     };
24*66e63ce3Schristos   };
25*66e63ce3Schristos 
26*66e63ce3Schristos   class Derived: public virtual Middle {
27*66e63ce3Schristos   protected:
28*66e63ce3Schristos     int z;
29*66e63ce3Schristos 
30*66e63ce3Schristos   public:
Derived(void)31*66e63ce3Schristos     Derived(void): Middle() { z = 4; };
32*66e63ce3Schristos 
get_z(void)33*66e63ce3Schristos     int get_z(void)
34*66e63ce3Schristos     {
35*66e63ce3Schristos       return z;			// breakpoint 2
36*66e63ce3Schristos     };
37*66e63ce3Schristos   };
38*66e63ce3Schristos }
39*66e63ce3Schristos 
40*66e63ce3Schristos // These classes are for PR 9629.
41*66e63ce3Schristos struct A {};
42*66e63ce3Schristos struct B : virtual A {};
43*66e63ce3Schristos 
CC44*66e63ce3Schristos struct C {int v; C() {v=11;};};
45*66e63ce3Schristos struct D:virtual C{};
46*66e63ce3Schristos 
47*66e63ce3Schristos class E:B,D{};
48*66e63ce3Schristos 
49*66e63ce3Schristos // These classes are for another regression test, from
50*66e63ce3Schristos // https://bugzilla.redhat.com/show_bug.cgi?id=560741
51*66e63ce3Schristos 
52*66e63ce3Schristos class RHA
53*66e63ce3Schristos {
54*66e63ce3Schristos public:
RHA()55*66e63ce3Schristos   RHA() : mA(0xaaaaaaaa) {}
56*66e63ce3Schristos   virtual void a() = 0;
57*66e63ce3Schristos   int mA;
58*66e63ce3Schristos };
59*66e63ce3Schristos 
60*66e63ce3Schristos class RHB
61*66e63ce3Schristos {
62*66e63ce3Schristos public:
RHB()63*66e63ce3Schristos   RHB() : mB(0xbbbbbbbb) {}
64*66e63ce3Schristos   virtual void b() = 0;
65*66e63ce3Schristos   int mB;
66*66e63ce3Schristos };
67*66e63ce3Schristos 
68*66e63ce3Schristos class RHC : public RHA,
69*66e63ce3Schristos 	  public RHB
70*66e63ce3Schristos {
71*66e63ce3Schristos public:
RHC()72*66e63ce3Schristos   RHC() : RHA(), RHB() {}
a()73*66e63ce3Schristos   virtual void a() {}
b()74*66e63ce3Schristos   virtual void b() {}
75*66e63ce3Schristos };
76*66e63ce3Schristos 
77*66e63ce3Schristos class RTTI_base
78*66e63ce3Schristos {
79*66e63ce3Schristos public:
~RTTI_base()80*66e63ce3Schristos   virtual ~RTTI_base() {}
81*66e63ce3Schristos };
82*66e63ce3Schristos 
83*66e63ce3Schristos class RTTI_data
84*66e63ce3Schristos {
85*66e63ce3Schristos public:
86*66e63ce3Schristos   RTTI_base base;
87*66e63ce3Schristos   int data;
RTTI_data()88*66e63ce3Schristos   RTTI_data() : data(1) {}
89*66e63ce3Schristos };
90*66e63ce3Schristos 
91*66e63ce3Schristos /* These classes are for testing pointer adjustment when printing a
92*66e63ce3Schristos    pointer into a virtual base, with print object on.  */
93*66e63ce3Schristos struct VirtualBase {
94*66e63ce3Schristos   int x;
95*66e63ce3Schristos 
~VirtualBaseVirtualBase96*66e63ce3Schristos   virtual ~VirtualBase() {}
97*66e63ce3Schristos };
98*66e63ce3Schristos 
99*66e63ce3Schristos struct VirtualMiddleA : public virtual VirtualBase {
100*66e63ce3Schristos   /* Make sure the vbase offset of Virtual::VirtualBaseB is larger
101*66e63ce3Schristos      than what fits in one byte.  */
102*66e63ce3Schristos   int y[300];
103*66e63ce3Schristos 
~VirtualMiddleAVirtualMiddleA104*66e63ce3Schristos   virtual ~VirtualMiddleA() {}
105*66e63ce3Schristos };
106*66e63ce3Schristos 
107*66e63ce3Schristos struct VirtualMiddleB : public virtual VirtualBase {
108*66e63ce3Schristos   int y;
109*66e63ce3Schristos 
~VirtualMiddleBVirtualMiddleB110*66e63ce3Schristos   virtual ~VirtualMiddleB() {}
111*66e63ce3Schristos };
112*66e63ce3Schristos 
113*66e63ce3Schristos struct Virtual : public virtual VirtualMiddleA, public virtual VirtualMiddleB {
114*66e63ce3Schristos   int z;
115*66e63ce3Schristos 
~VirtualVirtual116*66e63ce3Schristos   virtual ~Virtual() {}
117*66e63ce3Schristos };
118*66e63ce3Schristos 
119*66e63ce3Schristos Virtual virtual_o;
120*66e63ce3Schristos VirtualMiddleB *virtual_middle_b = &virtual_o;
121*66e63ce3Schristos 
main()122*66e63ce3Schristos int main() {
123*66e63ce3Schristos   ph::Derived tst;
124*66e63ce3Schristos   tst.get_y();
125*66e63ce3Schristos   tst.get_z();
126*66e63ce3Schristos 
127*66e63ce3Schristos   E *e = new E;
128*66e63ce3Schristos   RHB *b = new RHC();
129*66e63ce3Schristos   RTTI_data rtti_data;
130*66e63ce3Schristos 
131*66e63ce3Schristos   return 0;			// breakpoint 3
132*66e63ce3Schristos }
133