2003-12-26 Guilhem Lavaux <guilhem@kaffe.org>
[official-gcc.git] / gcc / testsuite / g++.old-deja / g++.robertl / eb99.C
blob7f2c83c2ee721455b36f5abed710b2ae029dfb31
1 // { dg-do assemble  }
2  
3  
4  
5  
6  
7  
9  
19 class ref_counted
22 protected:
23         ref_counted( void ) : _count( 0 ) {}
25 public:
27         unsigned int add_ref( void ) { return ++_count; }
28         unsigned int release( void ) { return --_count; }
29         unsigned int count( void ) const { return _count; }
32 protected:
33         unsigned int _count;
40 template < class T >
41 class ref_ptr
44 public:
45         ref_ptr( T* ptr = 0 ) : _ptr( ptr )
46         {
47                 add_ref();
48         }
50         ref_ptr( const ref_ptr & rptr ) : _ptr( rptr.get() )
51         {
52                 add_ref();
53         }
55         ~ref_ptr( void ) { release(); }
58         T* get( void ) const { return _ptr; }
59         T* operator->( void ) const { return get(); }
60         T& operator*( void ) const { return *get(); }
62         bool operator!( void ) const { return get() == 0; }
63         bool operator==( const ref_ptr & rptr ) const { return *get() == *rptr;
65         bool operator<( const ref_ptr & rptr ) const { return *get() < *rptr; }
68         bool operator==( T* ptr ) const { return *get() == *ptr; }
69         bool operator<( T* ptr ) const { return *get() < *ptr; }
71         const ref_ptr & operator=( const ref_ptr & rptr )
72         {
73                 release();
74                 _ptr = rptr.get();
75                 add_ref();
77                 return *this;
78         }
80        T* operator=( T* ptr )    
81        {
82          release();
83          _ptr = ptr;
84          add_ref();
86          return _ptr;
87        }
89 protected:
90         void add_ref( void )
91         {
92                 if( _ptr )
93                         _ptr->add_ref();
94         }
96         void release( void )
97         {
98                 if( _ptr && 0 == _ptr->release() )
99                 {
100                         delete _ptr;
101                         _ptr = 0;
102                 }
103         }
106 protected:
107         T *     _ptr;
111 template< class T >
112 bool operator==( T* ptr, const ref_ptr< T > & rptr )
114         return *ptr == *rptr;
117 template< class T >
118 bool operator<( T* ptr, const ref_ptr< T > & rptr )
120         return *ptr < *rptr;
125 class Baz : public ref_counted {
126   int dummy;
130 class Bar;
132 int main() {
133   ref_ptr<Baz> foo;
134   static_cast<Bar *> (foo)->DoSomething;  //{ dg-error "" } invalid cast