/* This testcase is part of GDB, the GNU debugger.
   Copyright 2013-2019 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;
}