| // { 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; |
| } |