1 /* This testcase is part of GDB, the GNU debugger.
2 
3    Copyright 2013-2021 Free Software Foundation, Inc.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17 
18 #ifdef DEBUG
19 #include <stdio.h>
20 #endif
21 
22 template <typename T>
23 class A
24 {
25 public:
26   T i;
27   T z;
A()28   A () : i (1), z (10) {}
29 };
30 
31 template <typename T>
32 class B : public virtual A<T>
33 {
34 public:
35   T i;
36   T common;
B()37   B () : i (2), common (200) {}
38 };
39 
40 typedef B<int> Bint;
41 
42 class C : public virtual A<int>
43 {
44 public:
45   int i;
46   int c;
47   int common;
C()48   C () : i (3), c (30), common (300) {}
49 };
50 
51 class BB : public A<int>
52 {
53 public:
54   int i;
BB()55   BB () : i (20) {}
56 };
57 
58 class CC : public A<int>
59 {
60 public:
61   int i;
CC()62   CC () : i (30) {}
63 };
64 
65 class Ambig : public BB, public CC
66 {
67 public:
68   int i;
Ambig()69   Ambig () : i (1000) {}
70 };
71 
72 class D : public Bint, public C
73 {
74 public:
75   int i;
76   int x;
77   Ambig am;
D()78   D () : i (4), x (40) {}
79 
80 #ifdef DEBUG
81 #define SUM(X)					\
82   do						\
83     {						\
84       sum += (X);				\
85       printf ("" #X " = %d\n", (X));		\
86     }						\
87   while (0)
88 #else
89 #define SUM(X) sum += (X)
90 #endif
91 
92 int
f(void)93 f (void)
94   {
95     int sum = 0;
96 
97     SUM (i);
98     SUM (D::i);
99     SUM (D::B<int>::i);
100     SUM (B<int>::i);
101     SUM (D::C::i);
102     SUM (C::i);
103     SUM (D::B<int>::A<int>::i);
104     SUM (B<int>::A<int>::i);
105     SUM (A<int>::i);
106     SUM (D::C::A<int>::i);
107     SUM (C::A<int>::i);
108     SUM (D::x);
109     SUM (x);
110     SUM (D::C::c);
111     SUM (C::c);
112     SUM (c);
113     SUM (D::A<int>::i);
114     SUM (Bint::i);
115     //SUM (D::Bint::i);
116     //SUM (D::Bint::A<int>::i);
117     SUM (Bint::A<int>::i);
118     // ambiguous: SUM (common);
119     SUM (B<int>::common);
120     SUM (C::common);
121     SUM (am.i);
122     // ambiguous: SUM (am.A<int>::i);
123 
124     return sum;
125   }
126 };
127 
128 int
main(void)129 main (void)
130 {
131   Bint b;
132   D d;
133 
134   return d.f () + b.i;
135 }
136