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