/* This testcase is part of GDB, the GNU debugger.
   Copyright 2014-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  .  */
namespace dop
{
class A
{
public:
  int a;
  int array [10];
  virtual ~A ();
  int operator+ (const A &obj);
  int operator- (const A &obj);
  virtual int geta (void);
};
A::~A () { }
int a_plus_a = 0;
int
A::operator+ (const A &obj)
{
  a_plus_a++;
  return a + obj.a;
}
int a_minus_a = 0;
int
A::operator- (const A &obj)
{
  a_minus_a++;
  return a - obj.a;
}
int a_geta = 0;
int
A::geta (void)
{
  a_geta++;
  return a;
}
class B : public A
{
public:
  virtual int geta (void);
};
int b_geta = 0;
int
B::geta (void)
{
  b_geta++;
  return 2 * a;
}
typedef B Bt;
typedef Bt Btt;
class E : public A
{
public:
  /* This class has a member named 'a', while the base class also has a
     member named 'a'.  When one invokes A::geta(), A::a should be
     returned and not E::a as the 'geta' method is defined on class 'A'.
     This class tests this aspect of debug methods.  */
  int a;
};
template 
class G
{
 public:
  template 
  int size_diff ();
  template 
  int size_mul ();
  template 
  T mul(const T1 t1);
 public:
  T t;
};
int g_size_diff = 0;
template 
template 
int
G::size_diff ()
{
  g_size_diff++;
  return sizeof (T1) - sizeof (T);
}
int g_size_mul = 0;
template 
template 
int
G::size_mul ()
{
  g_size_mul++;
  return M * sizeof (T);
}
int g_mul = 0;
template 
template 
T
G::mul (const T1 t1)
{
  g_mul++;
  return t1 * t;
}
}  // namespaxe dop
using namespace dop;
int main(void)
{
  A a1, a2;
  a1.a = 5;
  a2.a = 10;
  B b1;
  b1.a = 30;
  A *a_ptr = &b1;
  Bt bt;
  bt.a = 40;
  Btt btt;
  btt.a = -5;
  G g, *g_ptr;
  g.t = 5;
  g_ptr = &g;
  E e;
  E &e_ref = e;
  E *e_ptr = &e;
  e.a = 1000;
  e.A::a = 100;
  int diff = g.size_diff ();
  int smul = g.size_mul<2> ();
  int mul = g.mul (1.0);
  for (int i = 0; i < 10; i++)
    {
      a1.array[i] = a2.array[i] = b1.array[i] = i;
    }
  return 0; /* Break here.  */
}