diff --git a/include/boost/pointer_cast.hpp b/include/boost/pointer_cast.hpp index 44e67e4..7e04512 100644 --- a/include/boost/pointer_cast.hpp +++ b/include/boost/pointer_cast.hpp @@ -94,8 +94,6 @@ template std::unique_ptr static_pointer_cast( std::unique_p typedef typename std::unique_ptr::element_type E; - detail::assert_safe_moving_upcast(); - return std::unique_ptr( static_cast( r.release() ) ); } diff --git a/test/pointer_cast_test2.cpp b/test/pointer_cast_test2.cpp index 279c4ab..b8575b4 100644 --- a/test/pointer_cast_test2.cpp +++ b/test/pointer_cast_test2.cpp @@ -23,15 +23,15 @@ int main() #include #include -struct B +struct B1 { - virtual ~B() - { - } }; -struct D: B +struct D1: B1 { + ~D1() + { + } }; static void test_static_cast() @@ -77,23 +77,18 @@ static void test_static_cast() } { - std::unique_ptr p1( new D ); - D * q1 = p1.get(); + std::unique_ptr p1( new D1 ); + D1 * q1 = p1.get(); - std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); + std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); - } - { - std::unique_ptr p1( new D ); - B * q1 = p1.get(); + std::unique_ptr p3 = boost::static_pointer_cast( std::move( p2 ) ); - std::unique_ptr p2 = boost::static_pointer_cast( std::move( p1 ) ); - - BOOST_TEST( p1.get() == 0 ); - BOOST_TEST_EQ( p2.get(), q1 ); + BOOST_TEST( p2.get() == 0 ); + BOOST_TEST_EQ( p3.get(), q1 ); } } @@ -133,7 +128,7 @@ static void test_const_cast() #endif - { + { std::unique_ptr p1( new int[ 1 ] ); int * q1 = p1.get(); @@ -144,37 +139,65 @@ static void test_const_cast() } } +struct B2 +{ + virtual ~B2() + { + } +}; + +struct C2 +{ + virtual ~C2() + { + } +}; + +struct D2: B2, C2 +{ +}; + static void test_dynamic_cast() { { - std::unique_ptr p1( new D ); - D * q1 = p1.get(); + std::unique_ptr p1( new D2 ); + D2 * q1 = p1.get(); - std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); + std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { - std::unique_ptr p1( new D ); - B * q1 = p1.get(); + std::unique_ptr p1( new D2 ); + B2 * q1 = p1.get(); - std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); + std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); BOOST_TEST( p1.get() == 0 ); BOOST_TEST_EQ( p2.get(), q1 ); } { - std::unique_ptr p1( new B ); - B * q1 = p1.get(); + std::unique_ptr p1( new B2 ); + B2 * q1 = p1.get(); - std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); + std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); BOOST_TEST( p2.get() == 0 ); BOOST_TEST_EQ( p1.get(), q1 ); } + + { + D2 * q1 = new D2; + std::unique_ptr p1( q1 ); + + std::unique_ptr p2 = boost::dynamic_pointer_cast( std::move( p1 ) ); + + BOOST_TEST( p1.get() == 0 ); + BOOST_TEST_EQ( p2.get(), q1 ); + } } static void test_reinterpret_cast()