diff --git a/include/fmt/chrono.h b/include/fmt/chrono.h index 22bef59c..5aa2db76 100644 --- a/include/fmt/chrono.h +++ b/include/fmt/chrono.h @@ -415,7 +415,7 @@ struct formatter, Char> { if (begin == end) return begin; begin = internal::parse_width(begin, end, handler); end = parse_chrono_format(begin, end, internal::chrono_format_checker()); - format_str = basic_string_view(&*begin, end - begin); + format_str = basic_string_view(&*begin, static_cast(end - begin)); return end; } diff --git a/include/fmt/color.h b/include/fmt/color.h index 8c96f7fd..5db861c9 100644 --- a/include/fmt/color.h +++ b/include/fmt/color.h @@ -246,7 +246,8 @@ struct color_type { } FMT_CONSTEXPR color_type(rgb rgb_color) FMT_NOEXCEPT : is_rgb(true), value{} { - value.rgb_color = (rgb_color.r << 16) + (rgb_color.g << 8) + rgb_color.b; + value.rgb_color = (static_cast(rgb_color.r) << 16) + | (static_cast(rgb_color.g) << 8) | rgb_color.b; } FMT_CONSTEXPR color_type(terminal_color term_color) FMT_NOEXCEPT : is_rgb(), value{} { @@ -395,22 +396,22 @@ struct ansi_color_escape { // sequence. if (!text_color.is_rgb) { bool is_background = esc == internal::data::BACKGROUND_COLOR; - uint8_t value = text_color.value.term_color; + uint32_t value = text_color.value.term_color; // Background ASCII codes are the same as the foreground ones but with // 10 more. if (is_background) - value += 10; + value += 10u; std::size_t index = 0; buffer[index++] = static_cast('\x1b'); buffer[index++] = static_cast('['); - if (value >= 100) { + if (value >= 100u) { buffer[index++] = static_cast('1'); - value %= 100; + value %= 100u; } - buffer[index++] = static_cast('0' + value / 10); - buffer[index++] = static_cast('0' + value % 10); + buffer[index++] = static_cast('0' + value / 10u); + buffer[index++] = static_cast('0' + value % 10u); buffer[index++] = static_cast('m'); buffer[index++] = static_cast('\0'); @@ -452,7 +453,7 @@ struct ansi_color_escape { FMT_CONSTEXPR operator const Char *() const FMT_NOEXCEPT { return buffer; } private: - Char buffer[7 + 3 * 4 + 1]; + Char buffer[7u + 3u * 4u + 1u]; static FMT_CONSTEXPR void to_esc(uint8_t c, Char *out, char delimiter) FMT_NOEXCEPT { diff --git a/include/fmt/format-inl.h b/include/fmt/format-inl.h index 9b739635..69e94331 100644 --- a/include/fmt/format-inl.h +++ b/include/fmt/format-inl.h @@ -464,14 +464,14 @@ FMT_FUNC fp get_cached_power(int min_exponent, int &pow10_exponent) { } FMT_FUNC bool grisu2_round( - char *buf, ptrdiff_t &size, size_t max_digits, uint64_t delta, + char *buf, int &size, int max_digits, uint64_t delta, uint64_t remainder, uint64_t exp, uint64_t diff, int &exp10) { while (remainder < diff && delta - remainder >= exp && (remainder + exp < diff || diff - remainder > remainder + exp - diff)) { --buf[size - 1]; remainder += exp; } - if (size > static_cast(max_digits)) { + if (size > max_digits) { --size; ++exp10; if (buf[size] >= '5') @@ -482,8 +482,8 @@ FMT_FUNC bool grisu2_round( // Generates output using Grisu2 digit-gen algorithm. FMT_FUNC bool grisu2_gen_digits( - char *buf, ptrdiff_t &size, uint32_t hi, uint64_t lo, int &exp, - uint64_t delta, const fp &one, const fp &diff, size_t max_digits) { + char *buf, int &size, uint32_t hi, uint64_t lo, int &exp, + uint64_t delta, const fp &one, const fp &diff, int max_digits) { // Generate digits for the most significant part (hi). while (exp > 0) { uint32_t digit = 0; @@ -507,7 +507,7 @@ FMT_FUNC bool grisu2_gen_digits( buf[size++] = static_cast('0' + digit); --exp; uint64_t remainder = (static_cast(hi) << -one.e) + lo; - if (remainder <= delta || size > static_cast(max_digits)) { + if (remainder <= delta || size > max_digits) { return grisu2_round( buf, size, max_digits, delta, remainder, static_cast(data::POWERS_OF_10_32[exp]) << -one.e, @@ -523,7 +523,7 @@ FMT_FUNC bool grisu2_gen_digits( buf[size++] = static_cast('0' + digit); lo &= one.f - 1; --exp; - if (lo < delta || size > static_cast(max_digits)) { + if (lo < delta || size > max_digits) { return grisu2_round(buf, size, max_digits, delta, lo, one.f, diff.f * data::POWERS_OF_10_32[-exp], exp); } @@ -704,7 +704,7 @@ FMT_FUNC gen_digits_params process_specs(const core_format_specs &specs, ++num_digits; break; } - params.num_digits = to_unsigned(num_digits); + params.num_digits = num_digits; char_counter counter{num_digits}; grisu2_prettify(params, params.num_digits, exp - num_digits, counter); buf.resize(to_unsigned(counter.size)); @@ -750,7 +750,7 @@ FMT_FUNC typename std::enable_if::type // lo (p2 in Grisu) contains the least significants digits of scaled_upper. // lo = supper % one. uint64_t lo = upper.f & (one.f - 1); - ptrdiff_t size = 0; + int size = 0; if (!grisu2_gen_digits(buf.data(), size, hi, lo, exp, delta, one, diff, params.num_digits)) { buf.clear(); diff --git a/include/fmt/format.h b/include/fmt/format.h index 9f1ef6f8..63fbcae2 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -66,10 +66,6 @@ // many valid cases. # pragma GCC diagnostic ignored "-Wshadow" -// Disable the warning about implicit conversions that may change the sign of -// an integer; silencing it otherwise would require many explicit casts. -# pragma GCC diagnostic ignored "-Wsign-conversion" - // Disable the warning about nonliteral format strings because we construct // them dynamically when falling back to snprintf for FP formatting. # pragma GCC diagnostic ignored "-Wformat-nonliteral" @@ -959,8 +955,9 @@ inline wchar_t thousands_sep(locale_ref loc) { // thousands_sep is a functor that is called after writing each char to // add a thousands separator if necessary. template -inline Char *format_decimal(Char *buffer, UInt value, unsigned num_digits, +inline Char *format_decimal(Char *buffer, UInt value, int num_digits, ThousandsSep thousands_sep) { + FMT_ASSERT(num_digits >= 0, "invalid digit count"); buffer += num_digits; Char *end = buffer; while (value >= 100) { @@ -988,7 +985,8 @@ inline Char *format_decimal(Char *buffer, UInt value, unsigned num_digits, template inline Iterator format_decimal( - Iterator out, UInt value, unsigned num_digits, ThousandsSep sep) { + Iterator out, UInt value, int num_digits, ThousandsSep sep) { + FMT_ASSERT(num_digits >= 0, "invalid digit count"); typedef typename ThousandsSep::char_type char_type; // Buffer should be large enough to hold all digits (<= digits10 + 1). enum { max_size = std::numeric_limits::digits10 + 1 }; @@ -999,12 +997,12 @@ inline Iterator format_decimal( } template -inline It format_decimal(It out, UInt value, unsigned num_digits) { +inline It format_decimal(It out, UInt value, int num_digits) { return format_decimal(out, value, num_digits, no_thousands_sep()); } template -inline Char *format_uint(Char *buffer, UInt value, unsigned num_digits, +inline Char *format_uint(Char *buffer, UInt value, int num_digits, bool upper = false) { buffer += num_digits; Char *end = buffer; @@ -1017,7 +1015,7 @@ inline Char *format_uint(Char *buffer, UInt value, unsigned num_digits, } template -inline It format_uint(It out, UInt value, unsigned num_digits, +inline It format_uint(It out, UInt value, int num_digits, bool upper = false) { // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1) // and null. diff --git a/include/fmt/time.h b/include/fmt/time.h index fbd3c60a..fe798916 100644 --- a/include/fmt/time.h +++ b/include/fmt/time.h @@ -122,7 +122,7 @@ struct formatter { auto end = it; while (end != ctx.end() && *end != '}') ++end; - tm_format.reserve(end - it + 1); + tm_format.reserve(internal::to_unsigned(end - it + 1)); tm_format.append(it, end); tm_format.push_back('\0'); return end;