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 & );
~Vector()73 	~Vector() { if(r) r->unrefer(); }
74 
row()75 	int row() const { return 19; }
dim()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::
Vector()96 Vector()
97 	: r(0)
98 {}
99 
100 Vector::
Vector(VectorInt * vi)101 Vector( VectorInt *vi )
102 	: r(vi)
103 {
104 	r->refer();
105 }
106 
107 Vector::
Vector(int row)108 Vector( int row )
109 {
110 	assert( row > 0 );
111 
112 	r = new VectorInt( row );
113 
114 	r->refer();
115 }
116 
117 Vector::
Vector(int row,double * d,int beg)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::
Vector(const Vector & A)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::
operator()144 operator()( int row ) const
145 {
146 	assert(r != 0);
147 
148 	return *r->vec;
149 }
150 
151 VecElem Vector::
operator()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::
assign(int rownum,double d)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::
VectorInt(int sx)187 VectorInt( int sx )
188 	: vec( new double[sx] ), count(0)
189 { }
190 
191 VectorInt::
VectorInt(int sx,double *,int)192 VectorInt( int sx, double *, int )
193 	: vec( new double[sx] ), count(0)
194 {
195 }
196 
197 VectorInt::
VectorInt(const VectorInt &)198 VectorInt( const VectorInt & )
199 	: vec( new double[10] ), count(0)
200 {
201 }
202 
203 VectorInt * VectorInt::
refer()204 refer()
205 {
206 	count ++;
207 	return this;
208 
209 	// cout << "Refering vec" << endl;
210 }
211 
212 void VectorInt::
unrefer()213 unrefer()
214 {
215 	count--;
216 
217 	if( count == 0 ) {
218 		delete this;
219 	}
220 
221 	// cout << "Unrefering vec" << endl;
222 }
223 
224 VectorInt::
~VectorInt()225 ~VectorInt()
226 {
227 	delete vec;
228 	vec = 0;
229 }
230 
231 VecElem::
VecElem(Vector & vec,int r)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::
VecElem(const VecElem & elem)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 
main()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
makeforms(Vector cen,Vector ** a,Vector ** b)281 makeforms( Vector cen, Vector **a, Vector **b)
282 {
283 	return 10;
284 }
285 
286 
287 
288