1// { dg-do assemble  }
2// Origin: Neil Booth, from bug report #36
3
4template <typename t> class vect;
5template <typename t> vect<t> operator-( const vect<t>&, const vect<t>& );
6
7template <typename t>
8class vect
9{
10public:
11  vect( t a );
12
13  vect( const vect<t>& v );
14  ~vect();
15
16  vect<t>& operator=( const vect<t>& v );
17  vect<t>  operator-( void ) const;
18  friend vect<t> (::operator- <>)( const vect<t>&, const vect<t>& );
19
20private:
21  t a_;
22};
23
24template <typename t> inline
25vect<t>::vect( t a )
26: a_(a)
27{
28}
29
30template <typename t> inline
31vect<t>::vect( const vect<t>& v )
32: a_(v.a_)
33{
34}
35
36template <typename t> inline
37vect<t>::~vect()
38{
39}
40
41template <typename t> inline vect<t>&
42vect<t>::operator=( const vect<t>& v )
43{
44   a_ = v.a_;
45   return *this;
46}
47
48template <typename t> inline vect<t>
49vect<t>::operator-( void ) const
50{
51  return vect<t>( -a_ );
52}
53
54template <typename t> inline vect<t>
55operator-( const vect<t>& u, const vect<t>& v )
56{
57  return vect<t>( u.a_ - v.a_ );
58}
59
60int
61main( void )
62{
63  vect<double> a( 1.0 ), b( 0.0 );
64  b = -a;
65}
66