diff --git a/doc/smart_ptr/atomic_shared_ptr.adoc b/doc/smart_ptr/atomic_shared_ptr.adoc index 5794711..1072b4f 100644 --- a/doc/smart_ptr/atomic_shared_ptr.adoc +++ b/doc/smart_ptr/atomic_shared_ptr.adoc @@ -35,7 +35,7 @@ namespace boost { public: - atomic_shared_ptr() noexcept = default; + constexpr atomic_shared_ptr() noexcept; atomic_shared_ptr( shared_ptr p ) noexcept; atomic_shared_ptr& operator=( shared_ptr r ) noexcept; @@ -64,6 +64,14 @@ namespace boost { ## Members +``` +constexpr atomic_shared_ptr() noexcept; +``` +[none] +* {blank} ++ +Effects:: Default-initializes `p_`. + ``` atomic_shared_ptr( shared_ptr p ) noexcept; ``` diff --git a/include/boost/smart_ptr/atomic_shared_ptr.hpp b/include/boost/smart_ptr/atomic_shared_ptr.hpp index 7590b67..d1efa8e 100644 --- a/include/boost/smart_ptr/atomic_shared_ptr.hpp +++ b/include/boost/smart_ptr/atomic_shared_ptr.hpp @@ -57,12 +57,22 @@ private: public: +#if !defined( BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX ) && !defined( BOOST_NO_CXX11_CONSTEXPR ) + + constexpr atomic_shared_ptr() BOOST_SP_NOEXCEPT: l_ BOOST_DETAIL_SPINLOCK_INIT + { + } + +#else + atomic_shared_ptr() BOOST_SP_NOEXCEPT { boost::detail::spinlock init = BOOST_DETAIL_SPINLOCK_INIT; std::memcpy( &l_, &init, sizeof( init ) ); } +#endif + atomic_shared_ptr( shared_ptr p ) BOOST_SP_NOEXCEPT #if !defined( BOOST_NO_CXX11_RVALUE_REFERENCES ) : p_( std::move( p ) ) diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 3037a44..6340cf5 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -216,6 +216,8 @@ import testing ; [ run sp_constexpr_test.cpp ] [ run sp_constexpr_test2.cpp ] + [ run atomic_sp_constexpr_test.cpp ] + [ run local_sp_test.cpp ] [ run lsp_array_test.cpp ] [ run lsp_array_n_test.cpp ] diff --git a/test/atomic_sp_constexpr_test.cpp b/test/atomic_sp_constexpr_test.cpp new file mode 100644 index 0000000..878fa6b --- /dev/null +++ b/test/atomic_sp_constexpr_test.cpp @@ -0,0 +1,67 @@ +// +// atomic_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 +#include + +#define HAVE_CONSTEXPR_INIT + +#if defined( BOOST_NO_CXX11_CONSTEXPR ) +# undef HAVE_CONSTEXPR_INIT +#endif + +#if BOOST_WORKAROUND( BOOST_MSVC, <= 1910 ) +# undef HAVE_CONSTEXPR_INIT +#endif + +#if defined(__clang__) && defined( BOOST_NO_CXX14_CONSTEXPR ) +# undef HAVE_CONSTEXPR_INIT +#endif + +#if !defined( HAVE_CONSTEXPR_INIT ) || !defined( BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX ) + +int main() +{ +} + +#else + +#include +#include + +struct X +{ +}; + +struct Z +{ + Z(); +}; + +static Z z; + +static boost::atomic_shared_ptr p1; + +Z::Z() +{ + p1 = boost::shared_ptr( new X ); +} + +int main() +{ + bost::shared_ptr p2 = p1; + + BOOST_TEST( p2.get() != 0 ); + BOOST_TEST_EQ( p2.use_count(), 1 ); + + return boost::report_errors(); +} + +#endif // #if defined( BOOST_NO_CXX11_CONSEXPR )