blob: 4f7807d11604acbb6b49257efb63274f996b8d86 [file] [log] [blame]
// { dg-do assemble }
// { dg-options "-Wno-deprecated -Wreturn-type" }
// GROUPS passed i960
/*
Bug Id: bnr
PMRS Id: p0000646
Bug is: Urgent Code Generation Problem in gcc-i960 V 1.95
*/
extern "C"
{
int printf (const char *, ...);
void abort ();
}
struct foo
{
static int si;
int i;
foo ();
foo (const foo&);
~foo ();
};
int
foo_parm_returns_i (foo foo_arg)
{
return foo_arg.i;
}
int foo::si = 0;
foo::foo ()
{
si++;
printf ("new foo @ 0x%x; now %d foos\n", this, si);
}
foo::foo (const foo &other)
{
si++;
printf ("another foo @ 0x%x; now %d foos\n", this, si);
*this = other;
}
foo::~foo ()
{
si--;
printf ("deleted foo @ 0x%x; now %d foos\n", this, si);
}
int
return_1 ()
{
foo f;
printf ("returning 1\n");
return 1;
}
int
return_arg (int arg)
{
foo f;
printf ("returning %d\n", arg);
return arg;
}
int
return_sum (int x, int y)
{
foo f;
printf ("returning %d+%d\n", x, y);
return x + y;
}
foo
return_foo ()
{
foo f;
printf ("returning foo\n");
return f;
}
foo
foo_parm_returns_foo (foo f)
{
return f;
}
void
abort_because (const char *str)
{
printf ("aborting because %s\n", str);
abort ();
}
int
warn_return_1 ()
{
foo f;
printf ("returning 1\n");
} // { dg-warning "" } control reaches end
int
warn_return_arg (int arg)
{
foo f;
printf ("returning %d\n", arg);
arg;
} // { dg-warning "" } control reaches end
int
warn_return_sum (int x, int y)
{
foo f;
printf ("returning %d+%d\n", x, y);
x + y;
} // { dg-warning "" } control reaches end
foo
warn_return_foo ()
{
foo f;
printf ("returning foo\n");
} // { dg-warning "" } control reaches end
foo
warn_foo_parm_returns_foo (foo f)
{
f;
} // { dg-warning "" } control reaches end
main () // { dg-warning "" } no type
{
int ii = return_1 ();
if (ii != 1)
abort_because ("wrong value returned");
int j = return_arg (42);
if (j != 42)
abort_because ("wrong value returned");
int k = return_sum (-69, 69);
if (k != 0)
abort_because ("wrong value returned");
foo f1 = return_foo ();
if (foo::si != 1)
abort_because ("wrong number of foos");
f1.i = 5;
int l = foo_parm_returns_i (f1);
if (l != 5)
abort_because ("l != 5");
foo f2 = foo_parm_returns_foo (f1);
if (foo::si != 2)
abort_because ("wrong number of foos");
if (f2.i != 5)
abort_because ("f2.i != 5");
foo f3 = return_foo ();
if (foo::si != 3)
abort_because ("wrong number of foos");
printf("PASS\n");
return 0;
}