mirror of
https://github.com/fmtlib/fmt.git
synced 2024-10-02 13:02:03 +00:00
Fix an overflow when formatting very large durations
This commit is contained in:
parent
fc2a376d8e
commit
784e2a7b42
@ -1663,15 +1663,16 @@ struct chrono_formatter {
|
|||||||
if (std::ratio_less<typename subsecond_precision::period,
|
if (std::ratio_less<typename subsecond_precision::period,
|
||||||
std::chrono::seconds::period>::value) {
|
std::chrono::seconds::period>::value) {
|
||||||
*out++ = '.';
|
*out++ = '.';
|
||||||
|
// Don't convert long double to integer seconds to avoid overflow.
|
||||||
|
using sec = conditional_t<
|
||||||
|
std::is_same<typename Duration::rep, long double>::value,
|
||||||
|
std::chrono::duration<long double>, std::chrono::seconds>;
|
||||||
|
auto fractional = detail::abs(d) - std::chrono::duration_cast<sec>(d);
|
||||||
const auto subseconds =
|
const auto subseconds =
|
||||||
std::chrono::treat_as_floating_point<
|
std::chrono::treat_as_floating_point<
|
||||||
typename subsecond_precision::rep>::value
|
typename subsecond_precision::rep>::value
|
||||||
? (detail::abs(d) -
|
? fractional.count()
|
||||||
std::chrono::duration_cast<std::chrono::seconds>(d))
|
: std::chrono::duration_cast<subsecond_precision>(fractional)
|
||||||
.count()
|
|
||||||
: std::chrono::duration_cast<subsecond_precision>(
|
|
||||||
detail::abs(d) -
|
|
||||||
std::chrono::duration_cast<std::chrono::seconds>(d))
|
|
||||||
.count();
|
.count();
|
||||||
uint32_or_64_or_128_t<long long> n =
|
uint32_or_64_or_128_t<long long> n =
|
||||||
to_unsigned(to_nonnegative_int(subseconds, max_value<long long>()));
|
to_unsigned(to_nonnegative_int(subseconds, max_value<long long>()));
|
||||||
|
Loading…
Reference in New Issue
Block a user