/* This testcase is part of GDB, the GNU debugger. Copyright 2013-2018 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 . */ #ifdef DEBUG #include #endif template class A { public: T i; T z; A () : i (1), z (10) {} }; template class B : public virtual A { public: T i; T common; B () : i (2), common (200) {} }; typedef B Bint; class C : public virtual A { public: int i; int c; int common; C () : i (3), c (30), common (300) {} }; class BB : public A { public: int i; BB () : i (20) {} }; class CC : public A { 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::i); SUM (B::i); SUM (D::C::i); SUM (C::i); SUM (D::B::A::i); SUM (B::A::i); SUM (A::i); SUM (D::C::A::i); SUM (C::A::i); SUM (D::x); SUM (x); SUM (D::C::c); SUM (C::c); SUM (c); SUM (D::A::i); SUM (Bint::i); //SUM (D::Bint::i); //SUM (D::Bint::A::i); SUM (Bint::A::i); // ambiguous: SUM (common); SUM (B::common); SUM (C::common); SUM (am.i); // ambiguous: SUM (am.A::i); return sum; } }; int main (void) { Bint b; D d; return d.f () + b.i; }