Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.old-deja/g++.robertl/eb99.C @ 158:494b0b89df80 default tip
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 18:13:55 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// { dg-do assemble } class ref_counted { protected: ref_counted( void ) : _count( 0 ) {} public: unsigned int add_ref( void ) { return ++_count; } unsigned int release( void ) { return --_count; } unsigned int count( void ) const { return _count; } protected: unsigned int _count; }; template < class T > class ref_ptr { public: ref_ptr( T* ptr = 0 ) : _ptr( ptr ) { add_ref(); } ref_ptr( const ref_ptr & rptr ) : _ptr( rptr.get() ) { add_ref(); } ~ref_ptr( void ) { release(); } T* get( void ) const { return _ptr; } T* operator->( void ) const { return get(); } T& operator*( void ) const { return *get(); } bool operator!( void ) const { return get() == 0; } bool operator==( const ref_ptr & rptr ) const { return *get() == *rptr; } bool operator<( const ref_ptr & rptr ) const { return *get() < *rptr; } bool operator==( T* ptr ) const { return *get() == *ptr; } bool operator<( T* ptr ) const { return *get() < *ptr; } const ref_ptr & operator=( const ref_ptr & rptr ) { release(); _ptr = rptr.get(); add_ref(); return *this; } T* operator=( T* ptr ) { release(); _ptr = ptr; add_ref(); return _ptr; } protected: void add_ref( void ) { if( _ptr ) _ptr->add_ref(); } void release( void ) { if( _ptr && 0 == _ptr->release() ) { delete _ptr; _ptr = 0; } } protected: T * _ptr; }; template< class T > bool operator==( T* ptr, const ref_ptr< T > & rptr ) { return *ptr == *rptr; } template< class T > bool operator<( T* ptr, const ref_ptr< T > & rptr ) { return *ptr < *rptr; } class Baz : public ref_counted { int dummy; }; class Bar; int main() { ref_ptr<Baz> foo; static_cast<Bar *> (foo)->DoSomething; //{ dg-error "" } invalid cast }