Workaround for Clang < 4 return type deduction under C++14

This commit is contained in:
Matt Borland
2023-04-18 14:54:03 +02:00
parent 6c0f8e8e3e
commit 6cf438f6ea
2 changed files with 14 additions and 5 deletions

View File

@@ -118,4 +118,13 @@ static_assert((BOOST_CHARCONV_ENDIAN_BIG_BYTE || BOOST_CHARCONV_ENDIAN_LITTLE_BY
#define BOOST_CHARCONV_SAFEBUFFERS
#endif
// Clang < 4 return type deduction does not work with the policy implementation
#ifndef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
# if defined(__clang__) && __clang_major__ < 4
# define BOOST_CHARCONV_NO_CXX14_RETURN_TYPE_DEDUCTION
# endif
#elif defined(BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION)
# define BOOST_CHARCONV_NO_CXX14_RETURN_TYPE_DEDUCTION
#endif
#endif // BOOST_CHARCONV_DETAIL_CONFIG_HPP

View File

@@ -2287,7 +2287,7 @@ namespace policy_impl {
template <typename... Policies>
struct policy_holder : Policies... {};
#ifndef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
#ifndef BOOST_CHARCONV_NO_CXX14_RETURN_TYPE_DEDUCTION
template <bool repeated, typename... FoundPolicyPairs, typename... Policies>
constexpr auto make_policy_holder_impl(base_default_pair_list<>, found_policy_pair_list<repeated, FoundPolicyPairs...>, Policies...)
@@ -2351,14 +2351,14 @@ template <typename Float, typename FloatTraits = dragonbox_float_traits<Float>,
BOOST_FORCEINLINE BOOST_CHARCONV_SAFEBUFFERS auto
to_decimal(dragonbox_signed_significand_bits<Float, FloatTraits> dragonbox_signed_significand_bits,
unsigned int exponent_bits, BOOST_ATTRIBUTE_UNUSED Policies... policies) noexcept
#ifdef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
#ifdef BOOST_CHARCONV_NO_CXX14_RETURN_TYPE_DEDUCTION
-> decimal_fp<typename FloatTraits::carrier_uint, true, false>
#endif
{
// Build policy holder type.
using namespace policy_impl;
#ifdef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
#ifdef BOOST_CHARCONV_NO_CXX14_RETURN_TYPE_DEDUCTION
// For C++11 we hardcode the policy holder
using policy_holder = policy_holder<decimal_to_binary_rounding::nearest_to_even, binary_to_decimal_rounding::to_even, cache::full, sign::return_sign, trailing_zero::remove>;
@@ -2506,7 +2506,7 @@ to_decimal(dragonbox_signed_significand_bits<Float, FloatTraits> dragonbox_signe
template <typename Float, typename FloatTraits = dragonbox_float_traits<Float>, typename... Policies>
BOOST_FORCEINLINE BOOST_CHARCONV_SAFEBUFFERS auto to_decimal(Float x, Policies... policies) noexcept
#ifdef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
#ifdef BOOST_CHARCONV_NO_CXX14_RETURN_TYPE_DEDUCTION
-> decimal_fp<typename FloatTraits::carrier_uint, true, false>
#endif
{
@@ -2570,7 +2570,7 @@ char* to_chars_n(Float x, char* buffer, BOOST_ATTRIBUTE_UNUSED Policies... polic
{
using namespace policy_impl;
#ifdef BOOST_NO_CXX14_RETURN_TYPE_DEDUCTION
#ifdef BOOST_CHARCONV_NO_CXX14_RETURN_TYPE_DEDUCTION
// For C++11 we hardcode the policy holder
using policy_holder = policy_holder<decimal_to_binary_rounding::nearest_to_even, binary_to_decimal_rounding::to_even, cache::full, sign::return_sign, trailing_zero::remove>;