Fix build: make n unsigned properly

This commit is contained in:
Stepan Ponomarev 2022-11-02 14:28:34 +01:00
parent 54fa95f013
commit e30efa75f8

View File

@ -1038,12 +1038,13 @@ void write_fractional_seconds(OutputIt& out, Duration d, int precision = -1) {
const auto fractional = const auto fractional =
detail::abs(d) - std::chrono::duration_cast<std::chrono::seconds>(d); detail::abs(d) - std::chrono::duration_cast<std::chrono::seconds>(d);
uint32_or_64_or_128_t<long long> 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
? fractional.count() ? fractional.count()
: std::chrono::duration_cast<subsecond_precision>(fractional).count(); : std::chrono::duration_cast<subsecond_precision>(fractional).count();
const int num_digits = detail::count_digits(subseconds); auto n = static_cast<uint32_or_64_or_128_t<long long>>(subseconds);
const int num_digits = detail::count_digits(n);
int leading_zeroes = std::max(0, num_fractional_digits - num_digits); int leading_zeroes = std::max(0, num_fractional_digits - num_digits);
if (precision < 0) { if (precision < 0) {
@ -1052,7 +1053,7 @@ void write_fractional_seconds(OutputIt& out, Duration d, int precision = -1) {
std::chrono::seconds::period>::value) { std::chrono::seconds::period>::value) {
*out++ = '.'; *out++ = '.';
out = std::fill_n(out, leading_zeroes, '0'); out = std::fill_n(out, leading_zeroes, '0');
out = format_decimal<Char>(out, subseconds, num_digits).end; out = format_decimal<Char>(out, n, num_digits).end;
} }
} else { } else {
*out++ = '.'; *out++ = '.';
@ -1060,12 +1061,11 @@ void write_fractional_seconds(OutputIt& out, Duration d, int precision = -1) {
out = std::fill_n(out, leading_zeroes, '0'); out = std::fill_n(out, leading_zeroes, '0');
int remaining = precision - leading_zeroes; int remaining = precision - leading_zeroes;
if (remaining < num_digits) { if (remaining < num_digits) {
subseconds /= n /= to_unsigned(detail::pow10(to_unsigned(num_digits - remaining)));
to_unsigned(detail::pow10(to_unsigned(num_digits - remaining))); out = format_decimal<Char>(out, n, remaining).end;
out = format_decimal<Char>(out, subseconds, remaining).end;
return; return;
} }
out = format_decimal<Char>(out, subseconds, num_digits).end; out = format_decimal<Char>(out, n, num_digits).end;
remaining -= num_digits; remaining -= num_digits;
out = std::fill_n(out, remaining, '0'); out = std::fill_n(out, remaining, '0');
} }