blob: 6db67e9085ce0f6ef317a03859a93f3078e4a707 [file] [log] [blame]
/* This testcase is part of GDB, the GNU debugger.
Copyright 2013-2021 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
#ifdef DEBUG
#include <stdio.h>
#endif
template <typename T>
class A
{
public:
T i;
T z;
A () : i (1), z (10) {}
};
template <typename T>
class B : public virtual A<T>
{
public:
T i;
T common;
B () : i (2), common (200) {}
};
typedef B<int> Bint;
class C : public virtual A<int>
{
public:
int i;
int c;
int common;
C () : i (3), c (30), common (300) {}
};
class BB : public A<int>
{
public:
int i;
BB () : i (20) {}
};
class CC : public A<int>
{
public:
int i;
CC () : i (30) {}
};
class Ambig : public BB, public CC
{
public:
int i;
Ambig () : i (1000) {}
};
class D : public Bint, public C
{
public:
int i;
int x;
Ambig am;
D () : i (4), x (40) {}
#ifdef DEBUG
#define SUM(X) \
do \
{ \
sum += (X); \
printf ("" #X " = %d\n", (X)); \
} \
while (0)
#else
#define SUM(X) sum += (X)
#endif
int
f (void)
{
int sum = 0;
SUM (i);
SUM (D::i);
SUM (D::B<int>::i);
SUM (B<int>::i);
SUM (D::C::i);
SUM (C::i);
SUM (D::B<int>::A<int>::i);
SUM (B<int>::A<int>::i);
SUM (A<int>::i);
SUM (D::C::A<int>::i);
SUM (C::A<int>::i);
SUM (D::x);
SUM (x);
SUM (D::C::c);
SUM (C::c);
SUM (c);
SUM (D::A<int>::i);
SUM (Bint::i);
//SUM (D::Bint::i);
//SUM (D::Bint::A<int>::i);
SUM (Bint::A<int>::i);
// ambiguous: SUM (common);
SUM (B<int>::common);
SUM (C::common);
SUM (am.i);
// ambiguous: SUM (am.A<int>::i);
return sum;
}
};
int
main (void)
{
Bint b;
D d;
return d.f () + b.i;
}