mirror of
https://github.com/boostorg/core.git
synced 2025-05-09 14:57:46 +00:00
The rename allows to avoid forming an infinite recursion in compile time (because of noexcept specification that needs to resolve the unqualified call to swap) or run time (in case if the boost::swap function is the only one suitable for the passed arguments). To avoid the compile-time recursion, removed noexcept specification from boost::swap. The specification is still present in boost::core::invoke_swap. Deprecated boost::swap and associated headers. boost::core::invoke_swap is defined in a new boost/core/invoke_swap.hpp header. Updated docs and tests. Removed tests that check inclusion of deprecated headers. Fixes https://github.com/boostorg/core/issues/148.
43 lines
1.4 KiB
C++
43 lines
1.4 KiB
C++
// Copyright (c) 2023 Andrey Semashev
|
|
//
|
|
// 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)
|
|
|
|
// Tests that boost::core::invoke_swap propagates noexcept specification correctly
|
|
|
|
#include <boost/core/invoke_swap.hpp>
|
|
#include <boost/config.hpp>
|
|
|
|
#if !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_CXX11_STATIC_ASSERT) && \
|
|
!(defined(BOOST_GCC) && (BOOST_GCC < 40700))
|
|
|
|
namespace test_ns {
|
|
|
|
struct class_with_noexcept_swap
|
|
{
|
|
static class_with_noexcept_swap& instance() noexcept;
|
|
|
|
friend void swap(class_with_noexcept_swap&, class_with_noexcept_swap&) noexcept
|
|
{
|
|
}
|
|
};
|
|
|
|
struct class_with_except_swap
|
|
{
|
|
static class_with_except_swap& instance() noexcept;
|
|
|
|
friend void swap(class_with_except_swap&, class_with_except_swap&)
|
|
{
|
|
}
|
|
};
|
|
|
|
} // namespace test_ns
|
|
|
|
static_assert(noexcept(boost::core::invoke_swap(test_ns::class_with_noexcept_swap::instance(), test_ns::class_with_noexcept_swap::instance())),
|
|
"boost::core::invoke_swap for class_with_noexcept_swap should have noexcept specification");
|
|
static_assert(!noexcept(boost::core::invoke_swap(test_ns::class_with_except_swap::instance(), test_ns::class_with_except_swap::instance())),
|
|
"boost::core::invoke_swap for class_with_except_swap should not have noexcept specification");
|
|
|
|
#endif // !defined(BOOST_NO_CXX11_NOEXCEPT) && !defined(BOOST_NO_CXX11_STATIC_ASSERT) ...
|