blob: f4acc0949196a5d3854f2bff4fa89e0dad99fb01 [file] [log] [blame]
/* 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 */
}