Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r51632 - in branches/release: boost/smart_ptr libs/smart_ptr/test
From: pdimov_at_[hidden]
Date: 2009-03-05 18:06:18


Author: pdimov
Date: 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
New Revision: 51632
URL: http://svn.boost.org/trac/boost/changeset/51632

Log:
Merge [51581] to release. Fixes #2126. Fixes #2584.
Added:
   branches/release/libs/smart_ptr/test/allocate_shared_esft_test.cpp
      - copied unchanged from r51581, /trunk/libs/smart_ptr/test/allocate_shared_esft_test.cpp
   branches/release/libs/smart_ptr/test/esft_second_ptr_test.cpp
      - copied unchanged from r51581, /trunk/libs/smart_ptr/test/esft_second_ptr_test.cpp
   branches/release/libs/smart_ptr/test/esft_void_test.cpp
      - copied unchanged from r51581, /trunk/libs/smart_ptr/test/esft_void_test.cpp
   branches/release/libs/smart_ptr/test/make_shared_esft_test.cpp
      - copied unchanged from r51581, /trunk/libs/smart_ptr/test/make_shared_esft_test.cpp
Text files modified:
   branches/release/boost/smart_ptr/enable_shared_from_this.hpp | 36 +++++---
   branches/release/boost/smart_ptr/make_shared.hpp | 154 ++++++++++++++++++++++++++++-----------
   branches/release/boost/smart_ptr/shared_ptr.hpp | 31 +++----
   branches/release/libs/smart_ptr/test/Jamfile.v2 | 4 +
   branches/release/libs/smart_ptr/test/allocate_shared_test.cpp | 9 ++
   branches/release/libs/smart_ptr/test/make_shared_test.cpp | 9 ++
   branches/release/libs/smart_ptr/test/shared_from_this_test.cpp | 47 +++++++----
   branches/release/libs/smart_ptr/test/shared_ptr_move_test.cpp | 11 ++
   8 files changed, 207 insertions(+), 94 deletions(-)

Modified: branches/release/boost/smart_ptr/enable_shared_from_this.hpp
==============================================================================
--- branches/release/boost/smart_ptr/enable_shared_from_this.hpp (original)
+++ branches/release/boost/smart_ptr/enable_shared_from_this.hpp 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -4,11 +4,11 @@
 //
 // enable_shared_from_this.hpp
 //
-// Copyright (c) 2002 Peter Dimov
+// Copyright 2002, 2009 Peter Dimov
 //
-// Distributed under the Boost Software License, Version 1.0. (See
-// accompanying file LICENSE_1_0.txt or copy at
-// http://www.boost.org/LICENSE_1_0.txt)
+// Distributed under the Boost Software License, Version 1.0.
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
 //
 // http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
 //
@@ -46,26 +46,32 @@
 
     shared_ptr<T> shared_from_this()
     {
- shared_ptr<T> p(_internal_weak_this);
- BOOST_ASSERT(p.get() == this);
+ shared_ptr<T> p( weak_this_ );
+ BOOST_ASSERT( p.get() == this );
         return p;
     }
 
     shared_ptr<T const> shared_from_this() const
     {
- shared_ptr<T const> p(_internal_weak_this);
- BOOST_ASSERT(p.get() == this);
+ shared_ptr<T const> p( weak_this_ );
+ BOOST_ASSERT( p.get() == this );
         return p;
     }
 
-// Note: No, you don't need to initialize _internal_weak_this
-//
-// Please read the documentation, not the code
-//
-// http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
+public: // actually private, but avoids compiler template friendship issues
+
+ // Note: invoked automatically by shared_ptr; do not call
+ template<class X, class Y> void _internal_accept_owner( shared_ptr<X> const * ppx, Y * py ) const
+ {
+ if( weak_this_.expired() )
+ {
+ weak_this_ = shared_ptr<T>( *ppx, py );
+ }
+ }
+
+private:
 
- typedef T _internal_element_type; // for bcc 5.5.1
- mutable weak_ptr<_internal_element_type> _internal_weak_this;
+ mutable weak_ptr<T> weak_this_;
 };
 
 } // namespace boost

Modified: branches/release/boost/smart_ptr/make_shared.hpp
==============================================================================
--- branches/release/boost/smart_ptr/make_shared.hpp (original)
+++ branches/release/boost/smart_ptr/make_shared.hpp 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -105,10 +105,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T();
+ ::new( pv ) T();
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A > boost::shared_ptr< T > allocate_shared( A const & a )
@@ -119,10 +122,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T();
+ ::new( pv ) T();
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 #if defined( BOOST_HAS_VARIADIC_TMPL ) && defined( BOOST_HAS_RVALUE_REFS )
@@ -137,10 +143,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( detail::forward<Args>( args )... );
+ ::new( pv ) T( detail::forward<Args>( args )... );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class... Args > boost::shared_ptr< T > allocate_shared( A const & a, Args && ... args )
@@ -151,10 +160,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( detail::forward<Args>( args )... );
+ ::new( pv ) T( detail::forward<Args>( args )... );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 #else
@@ -170,10 +182,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1 );
+ ::new( pv ) T( a1 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1 >
@@ -185,10 +200,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1 );
+ ::new( pv ) T( a1 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2 >
@@ -200,10 +218,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2 );
+ ::new( pv ) T( a1, a2 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2 >
@@ -215,10 +236,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2 );
+ ::new( pv ) T( a1, a2 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3 >
@@ -230,10 +254,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3 );
+ ::new( pv ) T( a1, a2, a3 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3 >
@@ -245,10 +272,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3 );
+ ::new( pv ) T( a1, a2, a3 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4 >
@@ -260,10 +290,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4 );
+ ::new( pv ) T( a1, a2, a3, a4 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4 >
@@ -275,10 +308,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4 );
+ ::new( pv ) T( a1, a2, a3, a4 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5 >
@@ -290,10 +326,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5 );
+ ::new( pv ) T( a1, a2, a3, a4, a5 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5 >
@@ -305,10 +344,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5 );
+ ::new( pv ) T( a1, a2, a3, a4, a5 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6 >
@@ -320,10 +362,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6 >
@@ -335,10 +380,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
@@ -350,10 +398,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7 >
@@ -365,10 +416,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
@@ -380,10 +434,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 >
@@ -395,10 +452,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
@@ -410,10 +470,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 template< class T, class A, class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9 >
@@ -425,10 +488,13 @@
 
     void * pv = pd->address();
 
- new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
+ ::new( pv ) T( a1, a2, a3, a4, a5, a6, a7, a8, a9 );
     pd->set_initialized();
 
- return boost::shared_ptr< T >( pt, static_cast< T* >( pv ) );
+ T * pt2 = static_cast< T* >( pv );
+
+ boost::detail::sp_enable_shared_from_this( &pt, pt2, pt2 );
+ return boost::shared_ptr< T >( pt, pt2 );
 }
 
 #endif

Modified: branches/release/boost/smart_ptr/shared_ptr.hpp
==============================================================================
--- branches/release/boost/smart_ptr/shared_ptr.hpp (original)
+++ branches/release/boost/smart_ptr/shared_ptr.hpp 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -58,6 +58,7 @@
 namespace boost
 {
 
+template<class T> class shared_ptr;
 template<class T> class weak_ptr;
 template<class T> class enable_shared_from_this;
 
@@ -100,9 +101,12 @@
 
 // enable_shared_from_this support
 
-template<class T, class Y> void sp_enable_shared_from_this( shared_count const & pn, boost::enable_shared_from_this<T> const * pe, Y const * px )
+template< class X, class Y, class T > inline void sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx, Y const * py, boost::enable_shared_from_this< T > const * pe )
 {
- if(pe != 0) pe->_internal_weak_this._internal_assign(const_cast<Y*>(px), pn);
+ if( pe != 0 )
+ {
+ pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
+ }
 }
 
 #ifdef _MANAGED
@@ -114,25 +118,16 @@
     template<class T> sp_any_pointer( T* ) {}
 };
 
-inline void sp_enable_shared_from_this( shared_count const & /*pn*/, sp_any_pointer, sp_any_pointer )
+inline void sp_enable_shared_from_this( sp_any_pointer, sp_any_pointer, sp_any_pointer )
 {
 }
 
 #else // _MANAGED
 
-#ifdef sgi
-// Turn off: the last argument of the varargs function "sp_enable_shared_from_this" is unnamed
-# pragma set woff 3506
-#endif
-
-inline void sp_enable_shared_from_this( shared_count const & /*pn*/, ... )
+inline void sp_enable_shared_from_this( ... )
 {
 }
 
-#ifdef sgi
-# pragma reset woff 3506
-#endif
-
 #endif // _MANAGED
 
 #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION ) && !defined( BOOST_NO_AUTO_PTR )
@@ -182,7 +177,7 @@
     template<class Y>
     explicit shared_ptr( Y * p ): px( p ), pn( p ) // Y must be complete
     {
- boost::detail::sp_enable_shared_from_this( pn, p, p );
+ boost::detail::sp_enable_shared_from_this( this, p, p );
     }
 
     //
@@ -193,14 +188,14 @@
 
     template<class Y, class D> shared_ptr(Y * p, D d): px(p), pn(p, d)
     {
- boost::detail::sp_enable_shared_from_this( pn, p, p );
+ boost::detail::sp_enable_shared_from_this( this, p, p );
     }
 
     // As above, but with allocator. A's copy constructor shall not throw.
 
     template<class Y, class D, class A> shared_ptr( Y * p, D d, A a ): px( p ), pn( p, d, a )
     {
- boost::detail::sp_enable_shared_from_this( pn, p, p );
+ boost::detail::sp_enable_shared_from_this( this, p, p );
     }
 
 // generated copy constructor, assignment, destructor are fine...
@@ -288,7 +283,7 @@
     {
         Y * tmp = r.get();
         pn = boost::detail::shared_count(r);
- boost::detail::sp_enable_shared_from_this( pn, tmp, tmp );
+ boost::detail::sp_enable_shared_from_this( this, tmp, tmp );
     }
 
 #if !defined( BOOST_NO_SFINAE ) && !defined( BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION )
@@ -298,7 +293,7 @@
     {
         typename Ap::element_type * tmp = r.get();
         pn = boost::detail::shared_count( r );
- boost::detail::sp_enable_shared_from_this( pn, tmp, tmp );
+ boost::detail::sp_enable_shared_from_this( this, tmp, tmp );
     }
 
 

Modified: branches/release/libs/smart_ptr/test/Jamfile.v2
==============================================================================
--- branches/release/libs/smart_ptr/test/Jamfile.v2 (original)
+++ branches/release/libs/smart_ptr/test/Jamfile.v2 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -48,5 +48,9 @@
           [ run ip_convertible_test.cpp ]
           [ run allocate_shared_test.cpp ]
           [ run sp_atomic_test.cpp ]
+ [ run esft_void_test.cpp ]
+ [ run esft_second_ptr_test.cpp ]
+ [ run make_shared_esft_test.cpp ]
+ [ run allocate_shared_esft_test.cpp ]
         ;
 }

Modified: branches/release/libs/smart_ptr/test/allocate_shared_test.cpp
==============================================================================
--- branches/release/libs/smart_ptr/test/allocate_shared_test.cpp (original)
+++ branches/release/libs/smart_ptr/test/allocate_shared_test.cpp 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -10,6 +10,7 @@
 #include <boost/make_shared.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/weak_ptr.hpp>
+#include <cstddef>
 
 class X
 {
@@ -18,6 +19,14 @@
     X( X const & );
     X & operator=( X const & );
 
+ void * operator new( std::size_t );
+
+ void operator delete( void * p )
+ {
+ // lack of this definition causes link errors on MSVC
+ ::operator delete( p );
+ }
+
 public:
 
     static int instances;

Modified: branches/release/libs/smart_ptr/test/make_shared_test.cpp
==============================================================================
--- branches/release/libs/smart_ptr/test/make_shared_test.cpp (original)
+++ branches/release/libs/smart_ptr/test/make_shared_test.cpp 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -10,6 +10,7 @@
 #include <boost/make_shared.hpp>
 #include <boost/shared_ptr.hpp>
 #include <boost/weak_ptr.hpp>
+#include <cstddef>
 
 class X
 {
@@ -18,6 +19,14 @@
     X( X const & );
     X & operator=( X const & );
 
+ void * operator new( std::size_t );
+
+ void operator delete( void * p )
+ {
+ // lack of this definition causes link errors on MSVC
+ ::operator delete( p );
+ }
+
 public:
 
     static int instances;

Modified: branches/release/libs/smart_ptr/test/shared_from_this_test.cpp
==============================================================================
--- branches/release/libs/smart_ptr/test/shared_from_this_test.cpp (original)
+++ branches/release/libs/smart_ptr/test/shared_from_this_test.cpp 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -55,16 +55,23 @@
     BOOST_TEST(py.get() != 0);
     BOOST_TEST(py.use_count() == 1);
 
- boost::shared_ptr<X> px = py->getX();
- BOOST_TEST(px.get() != 0);
- BOOST_TEST(py.use_count() == 2);
-
- px->f();
-
- boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px);
- BOOST_TEST(py.get() == py2.get());
- BOOST_TEST(!(py < py2 || py2 < py));
- BOOST_TEST(py.use_count() == 3);
+ try
+ {
+ boost::shared_ptr<X> px = py->getX();
+ BOOST_TEST(px.get() != 0);
+ BOOST_TEST(py.use_count() == 2);
+
+ px->f();
+
+ boost::shared_ptr<Y> py2 = boost::dynamic_pointer_cast<Y>(px);
+ BOOST_TEST(py.get() == py2.get());
+ BOOST_TEST(!(py < py2 || py2 < py));
+ BOOST_TEST(py.use_count() == 3);
+ }
+ catch( boost::bad_weak_ptr const& )
+ {
+ BOOST_ERROR( "py->getX() failed" );
+ }
 }
 
 void test2();
@@ -124,19 +131,25 @@
 {
     boost::shared_ptr<V> p(new V);
 
- boost::shared_ptr<V> q = p->shared_from_this();
- BOOST_TEST(p == q);
- BOOST_TEST(!(p < q) && !(q < p));
+ try
+ {
+ boost::shared_ptr<V> q = p->shared_from_this();
+ BOOST_TEST(p == q);
+ BOOST_TEST(!(p < q) && !(q < p));
+ }
+ catch( boost::bad_weak_ptr const & )
+ {
+ BOOST_ERROR( "p->shared_from_this() failed" );
+ }
 
     V v2(*p);
 
     try
     {
         boost::shared_ptr<V> r = v2.shared_from_this();
- BOOST_TEST( p < r || r < p );
- BOOST_TEST( r.get() == &v2 );
+ BOOST_ERROR("v2.shared_from_this() failed to throw");
     }
- catch(boost::bad_weak_ptr const &)
+ catch( boost::bad_weak_ptr const & )
     {
     }
 
@@ -147,7 +160,7 @@
         BOOST_TEST(p == r);
         BOOST_TEST(!(p < r) && !(r < p));
     }
- catch(boost::bad_weak_ptr const &)
+ catch( boost::bad_weak_ptr const & )
     {
         BOOST_ERROR("p->shared_from_this() threw bad_weak_ptr after *p = V()");
     }

Modified: branches/release/libs/smart_ptr/test/shared_ptr_move_test.cpp
==============================================================================
--- branches/release/libs/smart_ptr/test/shared_ptr_move_test.cpp (original)
+++ branches/release/libs/smart_ptr/test/shared_ptr_move_test.cpp 2009-03-05 18:06:17 EST (Thu, 05 Mar 2009)
@@ -8,6 +8,8 @@
 // http://www.boost.org/LICENSE_1_0.txt
 //
 
+#if defined( BOOST_HAS_RVALUE_REFS )
+
 #include <boost/shared_ptr.hpp>
 #include <boost/detail/lightweight_test.hpp>
 
@@ -93,3 +95,12 @@
 
     return boost::report_errors();
 }
+
+#else // !defined( BOOST_HAS_RVALUE_REFS )
+
+int main()
+{
+ return 0;
+}
+
+#endif


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk