OSDN Git Service

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