1 // { dg-do assemble }
2 // { dg-options "-Wno-deprecated -Wreturn-type" }
3 // GROUPS passed i960
4 /*
5 Bug Id: bnr
6 PMRS Id: p0000646
7 Bug is: Urgent Code Generation Problem in gcc-i960 V 1.95
8 */
9
10
11
12 extern "C"
13 {
14 int printf (const char *, ...);
15 void abort ();
16 }
17
18 struct foo
19 {
20 static int si;
21 int i;
22 foo ();
23 foo (const foo&);
24 ~foo ();
25 };
26
27 int
foo_parm_returns_i(foo foo_arg)28 foo_parm_returns_i (foo foo_arg)
29 {
30 return foo_arg.i;
31 }
32
33 int foo::si = 0;
34
foo()35 foo::foo ()
36 {
37 si++;
38 printf ("new foo @ 0x%x; now %d foos\n", this, si);
39 }
40
foo(const foo & other)41 foo::foo (const foo &other)
42 {
43 si++;
44 printf ("another foo @ 0x%x; now %d foos\n", this, si);
45 *this = other;
46 }
47
~foo()48 foo::~foo ()
49 {
50 si--;
51 printf ("deleted foo @ 0x%x; now %d foos\n", this, si);
52 }
53
54 int
return_1()55 return_1 ()
56 {
57 foo f;
58 printf ("returning 1\n");
59 return 1;
60 }
61
62 int
return_arg(int arg)63 return_arg (int arg)
64 {
65 foo f;
66 printf ("returning %d\n", arg);
67 return arg;
68 }
69
70 int
return_sum(int x,int y)71 return_sum (int x, int y)
72 {
73 foo f;
74 printf ("returning %d+%d\n", x, y);
75 return x + y;
76 }
77
78 foo
return_foo()79 return_foo ()
80 {
81 foo f;
82 printf ("returning foo\n");
83 return f;
84 }
85
86 foo
foo_parm_returns_foo(foo f)87 foo_parm_returns_foo (foo f)
88 {
89 return f;
90 }
91
92 void
abort_because(const char * str)93 abort_because (const char *str)
94 {
95 printf ("aborting because %s\n", str);
96 abort ();
97 }
98
99 int
warn_return_1()100 warn_return_1 ()
101 {
102 foo f;
103 printf ("returning 1\n");
104 } // { dg-warning "" } control reaches end
105
106 int
warn_return_arg(int arg)107 warn_return_arg (int arg)
108 {
109 foo f;
110 printf ("returning %d\n", arg);
111 arg;
112 } // { dg-warning "" } control reaches end
113
114 int
warn_return_sum(int x,int y)115 warn_return_sum (int x, int y)
116 {
117 foo f;
118 printf ("returning %d+%d\n", x, y);
119 x + y;
120 } // { dg-warning "" } control reaches end
121
122 foo
warn_return_foo()123 warn_return_foo ()
124 {
125 foo f;
126 printf ("returning foo\n");
127 } // { dg-warning "" } control reaches end
128
129 foo
warn_foo_parm_returns_foo(foo f)130 warn_foo_parm_returns_foo (foo f)
131 {
132 f;
133 } // { dg-warning "" } control reaches end
134
main()135 main () // { dg-warning "" } no type
136 {
137 int ii = return_1 ();
138 if (ii != 1)
139 abort_because ("wrong value returned");
140 int j = return_arg (42);
141 if (j != 42)
142 abort_because ("wrong value returned");
143 int k = return_sum (-69, 69);
144 if (k != 0)
145 abort_because ("wrong value returned");
146 foo f1 = return_foo ();
147 if (foo::si != 1)
148 abort_because ("wrong number of foos");
149 f1.i = 5;
150 int l = foo_parm_returns_i (f1);
151 if (l != 5)
152 abort_because ("l != 5");
153 foo f2 = foo_parm_returns_foo (f1);
154 if (foo::si != 2)
155 abort_because ("wrong number of foos");
156 if (f2.i != 5)
157 abort_because ("f2.i != 5");
158 foo f3 = return_foo ();
159 if (foo::si != 3)
160 abort_because ("wrong number of foos");
161 printf("PASS\n");
162 return 0;
163 }
164