Skip to content

Commit cb7f7b0

Browse files
authored
Merge pull request #732 from cppalliance/fix_clang19
Fix clang19
2 parents c1086d7 + a2265f3 commit cb7f7b0

File tree

3 files changed

+377
-276
lines changed

3 files changed

+377
-276
lines changed

include/boost/decimal/detail/attributes.hpp

Lines changed: 92 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <boost/decimal/fwd.hpp>
99
#include <boost/decimal/detail/type_traits.hpp>
1010
#include <boost/decimal/detail/config.hpp>
11+
#include <boost/decimal/detail/concepts.hpp>
12+
#include <boost/decimal/detail/promotion.hpp>
1113

1214
#ifndef BOOST_DECIMAL_BUILD_MODULE
1315
#include <type_traits>
@@ -19,102 +21,119 @@ namespace decimal {
1921
namespace detail {
2022

2123
// Values from IEEE 754-2019 table 3.6
24+
namespace impl {
25+
26+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
27+
constexpr auto storage_width_v() noexcept -> int
28+
{
29+
return decimal_val_v<DecimalType> < 64 ? 32 :
30+
decimal_val_v<DecimalType> < 128 ? 64 : 128;
31+
}
32+
33+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
34+
constexpr auto precision_v() noexcept -> int
35+
{
36+
return decimal_val_v<DecimalType> < 64 ? 7 :
37+
decimal_val_v<DecimalType> < 128 ? 16 : 34;
38+
}
39+
40+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
41+
constexpr auto bias_v() noexcept -> int
42+
{
43+
return decimal_val_v<DecimalType> < 64 ? 101 :
44+
decimal_val_v<DecimalType> < 128 ? 398 : 6176;
45+
}
46+
47+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
48+
constexpr auto max_biased_exp_v() noexcept -> int
49+
{
50+
return decimal_val_v<DecimalType> < 64 ? 191 :
51+
decimal_val_v<DecimalType> < 128 ? 767 : 12287;
52+
}
53+
54+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
55+
constexpr auto emax_v() noexcept -> int
56+
{
57+
return decimal_val_v<DecimalType> < 64 ? 96 :
58+
decimal_val_v<DecimalType> < 128 ? 384 : 6144;
59+
}
60+
61+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
62+
constexpr auto emin_v() noexcept -> int
63+
{
64+
return decimal_val_v<DecimalType> < 64 ? -95 :
65+
decimal_val_v<DecimalType> < 128 ? -383 : -6143;
66+
}
67+
68+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
69+
constexpr auto combination_field_width_v() noexcept -> int
70+
{
71+
return decimal_val_v<DecimalType> < 64 ? 11 :
72+
decimal_val_v<DecimalType> < 128 ? 13 : 17;
73+
}
74+
75+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
76+
constexpr auto trailing_significand_field_width_v() noexcept -> int
77+
{
78+
return decimal_val_v<DecimalType> < 64 ? 20 :
79+
decimal_val_v<DecimalType> < 128 ? 50 : 110;
80+
}
81+
82+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType, std::enable_if_t<decimal_val_v<DecimalType> < 128, bool> = true>
83+
constexpr auto max_significand_v() noexcept
84+
{
85+
return decimal_val_v<DecimalType> < 64 ? 9'999'999 : 9'999'999'999'999'999;
86+
}
87+
88+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType, std::enable_if_t<decimal_val_v<DecimalType> >= 128, bool> = true>
89+
constexpr auto max_significand_v() noexcept
90+
{
91+
return std::is_same<DecimalType, decimal128>::value ? uint128{UINT64_C(0b1111111111'1111111111'1111111111'1111111111'111111), UINT64_MAX} :
92+
uint128{UINT64_C(542101086242752), UINT64_C(4003012203950112767)};
93+
}
94+
95+
template <BOOST_DECIMAL_DECIMAL_FLOATING_TYPE DecimalType>
96+
constexpr auto max_string_length_v() noexcept -> int
97+
{
98+
return decimal_val_v<DecimalType> < 64 ? 15 :
99+
decimal_val_v<DecimalType> < 128 ? 25 : 41;
100+
}
101+
102+
} // namespace impl
22103

23104
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
24-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto storage_width_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 32 : 64;
25-
26-
template <>
27-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto storage_width_v<decimal128> = 128;
28-
29-
template <>
30-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto storage_width_v<decimal128_fast> = 128;
105+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto storage_width_v = impl::storage_width_v<Dec>();
31106

32107
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
33-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto precision_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 7 : 16;
34-
35-
template <>
36-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto precision_v<decimal128> = 34;
37-
38-
template <>
39-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto precision_v<decimal128_fast> = 34;
108+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto precision_v = impl::precision_v<Dec>();
40109

41110
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
42-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto bias_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 101 : 398;
43-
44-
template <>
45-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto bias_v<decimal128> = 6176;
46-
47-
template <>
48-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto bias_v<decimal128_fast> = 6176;
111+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto bias_v = impl::bias_v<Dec>();
49112

50113
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
51-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_biased_exp_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 191 : 767;
52-
53-
template <>
54-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_biased_exp_v<decimal128> = 12287;
55-
56-
template <>
57-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_biased_exp_v<decimal128_fast> = 12287;
114+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_biased_exp_v = impl::max_biased_exp_v<Dec>();
58115

59116
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
60-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emax_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 96 : 384;
61-
62-
template <>
63-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emax_v<decimal128> = 6144;
64-
65-
template <>
66-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emax_v<decimal128_fast> = 6144;
117+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emax_v = impl::emax_v<Dec>();
67118

68119
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
69-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emin_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? -95 : -383;
70-
71-
template <>
72-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emin_v<decimal128> = -6143;
73-
74-
template <>
75-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto emin_v<decimal128_fast> = -6143;
120+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto emin_v = impl::emin_v<Dec>();
76121

77122
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
78-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto etiny_v = -bias_v<Dec>;
123+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto etiny_v = -impl::bias_v<Dec>();
79124

80125
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
81-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto combination_field_width_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 11 : 13;
82-
83-
template <>
84-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto combination_field_width_v<decimal128> = 17;
85-
86-
template <>
87-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto combination_field_width_v<decimal128_fast> = 17;
126+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto combination_field_width_v = impl::combination_field_width_v<Dec>();
88127

89128
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
90-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto trailing_significand_field_width_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 20 : 50;
91-
92-
template <>
93-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto trailing_significand_field_width_v<decimal128> = 110;
94-
95-
template <>
96-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto trailing_significand_field_width_v<decimal128_fast> = 110;
129+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto trailing_significand_field_width_v = impl::trailing_significand_field_width_v<Dec>();
97130

98131
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
99-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_significand_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 9'999'999 : 9'999'999'999'999'999;
100-
101-
template <>
102-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_significand_v<decimal128> =
103-
uint128{UINT64_C(0b1111111111'1111111111'1111111111'1111111111'111111), UINT64_MAX};
104-
105-
template <>
106-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_significand_v<decimal128_fast> =
107-
uint128{UINT64_C(542101086242752), UINT64_C(4003012203950112767)};
132+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_significand_v = impl::max_significand_v<Dec>();
108133

109134
// sign + decimal digits + '.' + 'e' + '+/-' + max digits of exponent + null term
110135
template <typename Dec, std::enable_if_t<detail::is_decimal_floating_point_v<Dec>, bool> = true>
111-
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_string_length_v = std::is_same<Dec, decimal32>::value || std::is_same<Dec, decimal32_fast>::value ? 15 : 25;
112-
113-
template <>
114-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_string_length_v<decimal128> = 41;
115-
116-
template <>
117-
BOOST_DECIMAL_CONSTEXPR_VARIABLE_SPECIALIZATION auto max_string_length_v<decimal128_fast> = 41;
136+
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto max_string_length_v = impl::max_string_length_v<Dec>();
118137

119138
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto storage_width {storage_width_v<decimal32>};
120139
BOOST_DECIMAL_ATTRIBUTE_UNUSED BOOST_DECIMAL_CONSTEXPR_VARIABLE auto precision {precision_v<decimal32>};

include/boost/decimal/detail/config.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ typedef unsigned __int128 uint128_t;
264264
# define BOOST_DECIMAL_REDUCE_TEST_DEPTH
265265
#endif
266266

267-
#ifdef __clang__
267+
#if defined(__clang__) && __clang_major__ < 19
268268
# define BOOST_DECIMAL_CLANG_STATIC static
269269
#else
270270
# define BOOST_DECIMAL_CLANG_STATIC

0 commit comments

Comments
 (0)