Skip to content

Commit 8e0038b

Browse files
authored
Merge pull request #1122 from cppalliance/1119
Fix handling of extreme size literals
2 parents 4d0c7e2 + cf5ffa5 commit 8e0038b

File tree

3 files changed

+26
-72
lines changed

3 files changed

+26
-72
lines changed

doc/modules/ROOT/pages/literals.adoc

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,40 @@ namespace decimal {
2020
constexpr auto operator "" _DF(const char* str) -> decimal32_t
2121
constexpr auto operator "" _df(const char* str) -> decimal32_t
2222
23-
constexpr auto operator "" _DF(unsigned long long v) -> decimal32_t
24-
constexpr auto operator "" _df(unsigned long long v) -> decimal32_t
23+
constexpr auto operator "" _DF(const char* str, std::size_t len) -> decimal32_t
24+
constexpr auto operator "" _df(const char* str, std::size_t len) -> decimal32_t
2525
2626
constexpr auto operator "" _DD(const char* str) -> decimal64_t
2727
constexpr auto operator "" _dd(const char* str) -> decimal64_t
2828
29-
constexpr auto operator "" _DD(unsigned long long v) -> decimal64_t
30-
constexpr auto operator "" _dd(unsigned long long v) -> decimal64_t
29+
constexpr auto operator "" _DD(const char* str, std::size_t len) -> decimal64_t
30+
constexpr auto operator "" _dd(const char* str, std::size_t len) -> decimal64_t
3131
3232
constexpr auto operator "" _DL(const char* str) -> decimal128_t
3333
constexpr auto operator "" _dl(const char* str) -> decimal128_t
3434
35-
constexpr auto operator "" _DL(unsigned long long v) -> decimal128_t
36-
constexpr auto operator "" _dl(unsigned long long v) -> decimal128_t
35+
constexpr auto operator "" _DL(const char* str, std::size_t len) -> decimal128_t
36+
constexpr auto operator "" _dl(const char* str, std::size_t len) -> decimal128_t
3737
3838
// ----- Fast Type Literals -----
3939
4040
constexpr auto operator "" _DFF(const char* str) -> decimal_fast32_t
4141
constexpr auto operator "" _dff(const char* str) -> decimal_fast32_t
4242
43-
constexpr auto operator "" _DFF(unsigned long long v) -> decimal_fast32_t
44-
constexpr auto operator "" _dff(unsigned long long v) -> decimal_fast32_t
43+
constexpr auto operator "" _DFF(const char* str, std::size_t len) -> decimal_fast32_t
44+
constexpr auto operator "" _dff(const char* str, std::size_t len) -> decimal_fast32_t
4545
4646
constexpr auto operator "" _DDF(const char* str) -> decimal_fast64_t
4747
constexpr auto operator "" _ddf(const char* str) -> decimal_fast64_t
4848
49-
constexpr auto operator "" _DDF(unsigned long long v) -> decimal_fast64_t
50-
constexpr auto operator "" _ddf(unsigned long long v) -> decimal_fast64_t
49+
constexpr auto operator "" _DDF(const char* str, std::size_t len) -> decimal_fast64_t
50+
constexpr auto operator "" _ddf(const char* str, std::size_t len) -> decimal_fast64_t
5151
5252
constexpr auto operator "" _DLF(const char* str) -> decimal_fast128_t
5353
constexpr auto operator "" _dlf(const char* str) -> decimal_fast128_t
5454
55-
constexpr auto operator "" _DLF(unsigned long long v) -> decimal_fast128_t
56-
constexpr auto operator "" _dlf(unsigned long long v) -> decimal_fast128_t
55+
constexpr auto operator "" _DLF(const char* str, std::size_t len) -> decimal_fast128_t
56+
constexpr auto operator "" _dlf(const char* str, std::size_t len) -> decimal_fast128_t
5757
5858
} //namespace decimal
5959
} //namespace boost

include/boost/decimal/literals.hpp

Lines changed: 0 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,6 @@ BOOST_DECIMAL_EXPORT constexpr auto operator ""_df(const char *str, const std::s
5555
return d;
5656
}
5757

58-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DF(const unsigned long long v) -> decimal32_t
59-
{
60-
return decimal32_t {v};
61-
}
62-
63-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_df(const unsigned long long v) -> decimal32_t
64-
{
65-
return decimal32_t {v};
66-
}
67-
6858
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DFF(const char *str) -> decimal_fast32_t
6959
{
7060
decimal_fast32_t d;
@@ -93,16 +83,6 @@ BOOST_DECIMAL_EXPORT constexpr auto operator ""_dff(const char *str, const std::
9383
return d;
9484
}
9585

96-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DFF(const unsigned long long v) -> decimal_fast32_t
97-
{
98-
return decimal_fast32_t {v};
99-
}
100-
101-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_dff(const unsigned long long v) -> decimal_fast32_t
102-
{
103-
return decimal_fast32_t {v};
104-
}
105-
10686
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DD(const char *str) -> decimal64_t
10787
{
10888
decimal64_t d;
@@ -131,16 +111,6 @@ BOOST_DECIMAL_EXPORT constexpr auto operator ""_dd(const char *str, std::size_t)
131111
return d;
132112
}
133113

134-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DD(const unsigned long long v) -> decimal64_t
135-
{
136-
return decimal64_t {v};
137-
}
138-
139-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_dd(const unsigned long long v) -> decimal64_t
140-
{
141-
return decimal64_t {v};
142-
}
143-
144114
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DDF(const char *str) -> decimal_fast64_t
145115
{
146116
decimal_fast64_t d;
@@ -169,16 +139,6 @@ BOOST_DECIMAL_EXPORT constexpr auto operator ""_ddf(const char *str, const std::
169139
return d;
170140
}
171141

172-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DDF(const unsigned long long v) -> decimal_fast64_t
173-
{
174-
return decimal_fast64_t {v};
175-
}
176-
177-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_ddf(const unsigned long long v) -> decimal_fast64_t
178-
{
179-
return decimal_fast64_t {v};
180-
}
181-
182142
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DL(const char *str) -> decimal128_t
183143
{
184144
decimal128_t d;
@@ -207,16 +167,6 @@ BOOST_DECIMAL_EXPORT constexpr auto operator ""_dl(const char *str, std::size_t)
207167
return d;
208168
}
209169

210-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DL(const unsigned long long v) -> decimal128_t
211-
{
212-
return decimal128_t {v};
213-
}
214-
215-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_dl(const unsigned long long v) -> decimal128_t
216-
{
217-
return decimal128_t {v};
218-
}
219-
220170
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DLF(const char *str) -> decimal_fast128_t
221171
{
222172
decimal_fast128_t d;
@@ -245,16 +195,6 @@ BOOST_DECIMAL_EXPORT constexpr auto operator ""_dlf(const char *str, const std::
245195
return d;
246196
}
247197

248-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_DLF(const unsigned long long v) -> decimal_fast128_t
249-
{
250-
return decimal_fast128_t {v};
251-
}
252-
253-
BOOST_DECIMAL_EXPORT constexpr auto operator ""_dlf(const unsigned long long v) -> decimal_fast128_t
254-
{
255-
return decimal_fast128_t {v};
256-
}
257-
258198
} // namespace literals
259199
} // namespace decimal
260200
} // namespace boost

test/test_literals.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,18 @@ void construct_negative_infinity()
132132
BOOST_TEST_EQ("-inf"_DLF, -"inf"_DLF);
133133
}
134134

135+
void test_issue_1119()
136+
{
137+
using namespace boost::decimal::literals;
138+
139+
const auto val = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_DD;
140+
BOOST_TEST_EQ(val, decimal64_t(1, 198));
141+
142+
const auto overflow_val = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000_df;
143+
BOOST_TEST(isinf(overflow_val));
144+
BOOST_TEST(!signbit(overflow_val));
145+
}
146+
135147
int main()
136148
{
137149
test_decimal32_t_literals();
@@ -144,5 +156,7 @@ int main()
144156

145157
construct_negative_infinity();
146158

159+
test_issue_1119();
160+
147161
return boost::report_errors();
148162
}

0 commit comments

Comments
 (0)