/* This testcase is part of GDB, the GNU debugger.

   Copyright 2014-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/>.  */

class S
{
public:
  S () { }
  S (S &obj);

  S operator+ (const S &s);

  int a;
};

S::S (S &obj)
{
  a = obj.a;
}

S
S::operator+ (const S &s)
{
  S res;

  res.a = a + s.a;

  return res;
}

S
f (int i)
{
  S s;

  s.a = i;

  return s;
}

int
g (const S &s)
{
  return s.a;
}

class A
{
public:
  A operator+ (const A &);
  int a;
};

A
A::operator+ (const A &obj)
{
  A n;

  n.a = a + obj.a;

  return n;
}

A
p ()
{
  A a;
  a.a = 12345678;
  return a;
}

A
r ()
{
  A a;
  a.a = 10000000;
  return a;
}

A
q (const A &a)
{
  return a;
}

class B
{
public:
  int b[1024];
};

B
makeb ()
{
  B b;
  int i;

  for (i = 0; i < 1024; i++)
    b.b[i] = i;

  return b;
}

int
getb (const B &b, int i)
{
  return b.b[i];
}

class C
{
public:
  C ();
  ~C ();

  A operator* ();

  A *a_ptr;
};

C::C ()
{
  a_ptr = new A;
  a_ptr->a = 5678;
}

C::~C ()
{
  delete a_ptr;
}

A
C::operator* ()
{
  return *a_ptr;
}

#define TYPE_INDEX 1

enum type
{
  INT,
  CHAR
};

union U
{
public:
  U (type t);
  type get_type ();

  int a;
  char c;
  type tp[2];
};

U::U (type t)
{
  tp[TYPE_INDEX] = t;
}

U
make_int ()
{
  return U (INT);
}

U
make_char ()
{
  return U (CHAR);
}

type
U::get_type ()
{
  return tp[TYPE_INDEX];
}

int
main ()
{
  int i = g(f(0));
  A a = q(p() + r());

  B b = makeb ();
  C c;

  return i + getb(b, 0);  /* Break here  */
}
