From 0e78e219f55d95b7fc0042d150ea03089aa58a78 Mon Sep 17 00:00:00 2001 From: Peter Dimov Date: Sun, 18 Jun 2017 02:43:20 +0300 Subject: [PATCH] Make default constructors constexpr --- .../boost/smart_ptr/detail/shared_count.hpp | 6 +- .../smart_ptr/enable_shared_from_this.hpp | 4 +- include/boost/smart_ptr/shared_ptr.hpp | 4 +- include/boost/smart_ptr/weak_ptr.hpp | 2 +- test/Jamfile.v2 | 3 + test/sp_constexpr_test.cpp | 71 +++++++++++++++++++ test/sp_constexpr_test2.cpp | 53 ++++++++++++++ 7 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 test/sp_constexpr_test.cpp create mode 100644 test/sp_constexpr_test2.cpp diff --git a/include/boost/smart_ptr/detail/shared_count.hpp b/include/boost/smart_ptr/detail/shared_count.hpp index 9813842..7f375e8 100644 --- a/include/boost/smart_ptr/detail/shared_count.hpp +++ b/include/boost/smart_ptr/detail/shared_count.hpp @@ -54,7 +54,7 @@ namespace boost namespace movelib { - template< class T, class D > class unique_ptr; +template< class T, class D > class unique_ptr; } // namespace movelib @@ -118,7 +118,7 @@ private: public: - shared_count(): pi_(0) // nothrow + BOOST_CONSTEXPR shared_count(): pi_(0) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(shared_count_id) #endif @@ -517,7 +517,7 @@ private: public: - weak_count(): pi_(0) // nothrow + BOOST_CONSTEXPR weak_count(): pi_(0) // nothrow #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS) , id_(weak_count_id) #endif diff --git a/include/boost/smart_ptr/enable_shared_from_this.hpp b/include/boost/smart_ptr/enable_shared_from_this.hpp index 07e8b8f..fc4de0b 100644 --- a/include/boost/smart_ptr/enable_shared_from_this.hpp +++ b/include/boost/smart_ptr/enable_shared_from_this.hpp @@ -26,11 +26,11 @@ template class enable_shared_from_this { protected: - enable_shared_from_this() BOOST_SP_NOEXCEPT + BOOST_CONSTEXPR enable_shared_from_this() BOOST_SP_NOEXCEPT { } - enable_shared_from_this(enable_shared_from_this const &) BOOST_SP_NOEXCEPT + BOOST_CONSTEXPR enable_shared_from_this(enable_shared_from_this const &) BOOST_SP_NOEXCEPT { } diff --git a/include/boost/smart_ptr/shared_ptr.hpp b/include/boost/smart_ptr/shared_ptr.hpp index 6f5810d..47d8339 100644 --- a/include/boost/smart_ptr/shared_ptr.hpp +++ b/include/boost/smart_ptr/shared_ptr.hpp @@ -345,13 +345,13 @@ public: typedef typename boost::detail::sp_element< T >::type element_type; - shared_ptr() BOOST_SP_NOEXCEPT : px( 0 ), pn() + BOOST_CONSTEXPR shared_ptr() BOOST_SP_NOEXCEPT : px( 0 ), pn() { } #if !defined( BOOST_NO_CXX11_NULLPTR ) - shared_ptr( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT : px( 0 ), pn() + BOOST_CONSTEXPR shared_ptr( boost::detail::sp_nullptr_t ) BOOST_SP_NOEXCEPT : px( 0 ), pn() { } diff --git a/include/boost/smart_ptr/weak_ptr.hpp b/include/boost/smart_ptr/weak_ptr.hpp index 391eac9..54d9ef3 100644 --- a/include/boost/smart_ptr/weak_ptr.hpp +++ b/include/boost/smart_ptr/weak_ptr.hpp @@ -32,7 +32,7 @@ public: typedef typename boost::detail::sp_element< T >::type element_type; - weak_ptr() BOOST_SP_NOEXCEPT : px(0), pn() + BOOST_CONSTEXPR weak_ptr() BOOST_SP_NOEXCEPT : px(0), pn() { } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index a6f6b0c..3037a44 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -213,6 +213,9 @@ import testing ; [ run atomic_sp_test.cpp ] + [ run sp_constexpr_test.cpp ] + [ run sp_constexpr_test2.cpp ] + [ run local_sp_test.cpp ] [ run lsp_array_test.cpp ] [ run lsp_array_n_test.cpp ] diff --git a/test/sp_constexpr_test.cpp b/test/sp_constexpr_test.cpp new file mode 100644 index 0000000..1d345ea --- /dev/null +++ b/test/sp_constexpr_test.cpp @@ -0,0 +1,71 @@ +// +// sp_constexpr_test.cpp +// +// Copyright 2017 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 +// + +#include + +#if defined( BOOST_NO_CXX11_CONSTEXPR ) + +int main() +{ +} + +#else + +#include +#include +#include +#include + +struct X: public boost::enable_shared_from_this +{ +}; + +struct Z +{ + Z(); +}; + +static Z z; + +static boost::shared_ptr p1; +static boost::weak_ptr p2; + +#if !defined( BOOST_NO_CXX11_NULLPTR ) + static boost::shared_ptr p3( nullptr ); +#endif + +Z::Z() +{ + p1.reset( new X ); + p2 = p1; +#if !defined( BOOST_NO_CXX11_NULLPTR ) + p3.reset( new X ); +#endif +} + +int main() +{ + BOOST_TEST( p1.get() != 0 ); + BOOST_TEST_EQ( p1.use_count(), 1 ); + + BOOST_TEST_EQ( p2.use_count(), 1 ); + BOOST_TEST_EQ( p2.lock(), p1 ); + +#if !defined( BOOST_NO_CXX11_NULLPTR ) + + BOOST_TEST( p3.get() != 0 ); + BOOST_TEST_EQ( p3.use_count(), 1 ); + +#endif + + return boost::report_errors(); +} + +#endif // #if defined( BOOST_NO_CXX11_CONSEXPR ) diff --git a/test/sp_constexpr_test2.cpp b/test/sp_constexpr_test2.cpp new file mode 100644 index 0000000..4e5cf37 --- /dev/null +++ b/test/sp_constexpr_test2.cpp @@ -0,0 +1,53 @@ +// +// sp_constexpr_test2.cpp +// +// Copyright 2017 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 +// + +#include + +#if defined( BOOST_NO_CXX11_CONSTEXPR ) + +int main() +{ +} + +#else + +#include +#include +#include +#include + +struct X: public boost::enable_shared_from_this +{ + int v_; + + constexpr X() BOOST_NOEXCEPT: v_( 1 ) + { + } +}; + +struct Z +{ + Z(); +}; + +static Z z; +static X x; + +Z::Z() +{ + BOOST_TEST_EQ( x.v_, 1 ); +} + +int main() +{ + return boost::report_errors(); +} + +#endif // #if defined( BOOST_NO_CXX11_CONSEXPR )