OSDN Git Service

* lib/obj-c++.exp (obj-c++_target_compile): Declare global variable,
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / g++.old-deja / g++.law / code-gen5.C
1 // { dg-do run  }
2 // GROUPS passed code-generation
3 // code-gen file
4 // From: "David" <norman@pi14.arc.umn.edu>
5 // Date:     Mon, 15 Nov 1993 20:59:14 -0600 (CST)
6 // Subject:  An error!
7 // Message-ID: <9311160259.AA03353@pi14.arc.umn.edu>
8
9 #include <cstdlib>
10 #include <cstdio>
11 #include <cassert>
12 #include <fstream>
13 #include <iostream>
14 #include <cmath>
15
16 #define ANSI_C
17
18 typedef double VEC ;
19
20 class Vector;
21
22 class VectorInt 
23 {
24         public:
25
26         /* Nothing public!! Only Vector can use this class */
27
28         private:
29
30         VectorInt( int );
31         VectorInt( int, double *, int = 0 );
32         VectorInt( const VectorInt & );
33         ~VectorInt();
34
35         VectorInt *refer();
36         void unrefer();
37         int count;                              /* Number of Vector's referring to me */
38
39         VEC *vec;
40
41         friend class Vector;
42         friend class VecElem;
43 };
44
45 class VecElem 
46 {
47         public:
48         
49         operator double();
50         double operator=( double );
51
52         private:
53
54         VecElem( Vector &, int );
55         VecElem( const VecElem & );
56
57         Vector &v;
58         int row;                                                /* Row element refers to */
59
60         friend class Vector;
61 };
62
63 class Vector 
64 {
65         public:
66
67         Vector();                                       // Must be assigned to before used
68         Vector( VectorInt * );
69         Vector( int );
70         Vector( int, double *, int beg = 0 );
71         Vector( const Vector & );
72         Vector &operator=( const Vector & );
73         ~Vector() { if(r) r->unrefer(); };
74
75         int row() const { return 19; }
76         int dim() const { return 10; }
77
78         double operator()( int ) const;
79         VecElem operator()( int );
80
81         double assign( int, double );
82
83         friend std::ostream& operator<<(std::ostream&, const Vector& m );
84         
85         private:
86
87         VectorInt *r;                   /* Reference to real data */
88
89         friend class VecElem;
90         friend class LUDecom;
91         friend class SVD;
92 };
93
94
95 Vector::
96 Vector()
97         : r(0)
98 {}
99
100 Vector::
101 Vector( VectorInt *vi )
102         : r(vi)
103 {
104         r->refer();
105 }
106
107 Vector::
108 Vector( int row )
109 {
110         assert( row > 0 );
111
112         r = new VectorInt( row );
113
114         r->refer();
115 }
116
117 Vector::
118 Vector( int row, double *d, int beg )
119 {
120         assert( row > 0 );
121
122         r = new VectorInt( row, d, beg );
123
124         r->refer();
125 }
126
127 Vector::
128 Vector( const Vector &A )
129         : r( A.r->refer() )
130 {}
131
132 Vector& Vector::
133 operator=( const Vector &A )
134 {
135         if( r )
136                 r->unrefer();
137
138         r = A.r->refer();
139
140         return *this;
141 }
142
143 double Vector::
144 operator()( int row ) const
145 {
146         assert(r != 0);
147
148         return *r->vec;
149 }
150
151 VecElem Vector::
152 operator()( int r )
153 {
154         assert(r != 0);
155
156         return VecElem( *this, r );
157 }
158
159         /* assign changes the matrix, it does not create a new one! */
160 double Vector::
161 assign( int rownum, double d )
162 {
163         assert(r != 0);
164
165         if( rownum > row() || rownum <= 0 ) {
166           std::cerr << "Warning: trying to assign out of bounds" << std::endl;
167           std::cerr << "row " << rownum << std::endl;
168           std::cerr << "Vector size " << row() << std::endl;
169           std::abort();
170         }
171
172         if( r->count == 1 ) {
173                         /* Don't need to create a new matrix, since we are the only */
174                         /*  one pointing to ours                                                                        */
175         }
176         else {
177                 VectorInt *vi = new VectorInt( *r );
178                 r->unrefer();
179                 r = vi->refer();
180         }
181
182         return d;
183 }
184
185
186 VectorInt::
187 VectorInt( int sx )
188         : vec( new double[sx] ), count(0)
189 { }
190
191 VectorInt::
192 VectorInt( int sx, double *, int )
193         : vec( new double[sx] ), count(0)
194 {
195 }
196
197 VectorInt::
198 VectorInt( const VectorInt & )
199         : vec( new double[10] ), count(0)
200 {
201 }
202
203 VectorInt * VectorInt::
204 refer()
205 {
206         count ++;
207         return this;
208
209         // cout << "Refering vec" << endl;
210 }
211
212 void VectorInt::
213 unrefer()
214 {
215         count--;
216
217         if( count == 0 ) {
218                 delete this;
219         }
220
221         // cout << "Unrefering vec" << endl;
222 }
223
224 VectorInt::
225 ~VectorInt()
226 {
227         delete vec;
228         vec = 0;
229 }
230
231 VecElem::
232 VecElem( Vector &vec, int r )
233         : v(vec), row(r)
234 {
235         if( r < 1 || r > vec.row() ) {
236           std::cerr << "Trying to access vector element out of bounds";
237           std::cerr << std::endl;
238           std::abort();
239         }
240 }
241
242 VecElem::
243 VecElem( const VecElem &elem )
244         : v(elem.v), row(elem.row)
245 {}
246
247 VecElem::
248 operator double()
249 {
250         assert( v.r->vec != 0 );
251         return *v.r->vec;
252 }
253
254 double VecElem::
255 operator=( double d )
256 {
257         return v.assign( row, d );
258 }
259
260
261
262
263
264 int makeforms( Vector cen, Vector **a, Vector **b );
265
266 int main()
267 {
268         Vector *a[8], *b[8], disp(3);
269         Vector cen(3), cen2(3);
270         int i, j;
271
272         if (makeforms (cen,a,b) != 10)
273           { std::printf ("FAIL\n"); return 1; }
274         else
275           std::printf ("PASS\n");
276
277
278 }
279
280 int
281 makeforms( Vector cen, Vector **a, Vector **b)
282 {
283         return 10;
284 }
285
286
287