Hello community, here is the log from the commit of package fmt for openSUSE:Factory checked in at 2020-11-06 23:44:13 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/fmt (Old) and /work/SRC/openSUSE:Factory/.fmt.new.11331 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fmt" Fri Nov 6 23:44:13 2020 rev:14 rq:846063 version:7.1.2 Changes: -------- --- /work/SRC/openSUSE:Factory/fmt/fmt.changes 2020-11-02 09:37:07.901422136 +0100 +++ /work/SRC/openSUSE:Factory/.fmt.new.11331/fmt.changes 2020-11-06 23:44:31.299330277 +0100 @@ -1,0 +2,20 @@ +Wed Nov 4 17:34:46 UTC 2020 - aloi...@gmx.com + +- Update to version 7.1.2 + * Fixed floating point formatting with large precision + +------------------------------------------------------------------- +Mon Nov 2 15:27:46 UTC 2020 - aloi...@gmx.com + +- Update to version 7.1.1 + * Fixed ABI compatibility with 7.0.x + * Added the FMT_ARM_ABI_COMPATIBILITY macro to work around + ABI incompatibility between GCC and Clang on ARM + * Worked around a SFINAE bug in GCC 8 + * Fixed linkage errors when building with GCC's LTO + * Fixed a compilation error when building without + __builtin_clz or equivalent + * Fixed a sign conversion warning +- Dropped fmt-7.1.0-LTO.patch (merged upstream) + +------------------------------------------------------------------- Old: ---- fmt-7.1.0-LTO.patch fmt-7.1.0.tar.gz New: ---- fmt-7.1.2.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ fmt.spec ++++++ --- /var/tmp/diff_new_pack.dUA8z8/_old 2020-11-06 23:44:31.751329408 +0100 +++ /var/tmp/diff_new_pack.dUA8z8/_new 2020-11-06 23:44:31.755329400 +0100 @@ -18,15 +18,13 @@ %define sover 7 Name: fmt -Version: 7.1.0 +Version: 7.1.2 Release: 0 Summary: A formatting library for C++ License: MIT URL: http://fmtlib.net/ Source0: https://github.com/fmtlib/fmt/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: baselibs.conf -# PATCH-FIX-UPSTREAM fmt-7.1.0-LTO.patch -Patch0: fmt-7.1.0-LTO.patch BuildRequires: cmake BuildRequires: gcc-c++ BuildRequires: pkgconfig ++++++ fmt-7.1.0.tar.gz -> fmt-7.1.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/ChangeLog.rst new/fmt-7.1.2/ChangeLog.rst --- old/fmt-7.1.0/ChangeLog.rst 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/ChangeLog.rst 2020-11-04 15:50:09.000000000 +0100 @@ -1,3 +1,33 @@ +7.1.2 - 2020-11-04 +------------------ + +* Fixed floating point formatting with large precision + (`#1976 <https://github.com/fmtlib/fmt/issues/1976>`_). + +7.1.1 - 2020-11-01 +------------------ + +* Fixed ABI compatibility with 7.0.x + (`#1961 <https://github.com/fmtlib/fmt/issues/1961>`_). + +* Added the ``FMT_ARM_ABI_COMPATIBILITY`` macro to work around ABI + incompatibility between GCC and Clang on ARM + (`#1919 <https://github.com/fmtlib/fmt/issues/1919>`_). + +* Worked around a SFINAE bug in GCC 8 + (`#1957 <https://github.com/fmtlib/fmt/issues/1957>`_). + +* Fixed linkage errors when building with GCC's LTO + (`#1955 <https://github.com/fmtlib/fmt/issues/1955>`_). + +* Fixed a compilation error when building without ``__builtin_clz`` or equivalent + (`#1968 <https://github.com/fmtlib/fmt/pull/1968>`_). + Thanks `@tohammer (Tobias Hammer) <https://github.com/tohammer>`_. + +* Fixed a sign conversion warning + (`#1964 <https://github.com/fmtlib/fmt/pull/1964>`_). + Thanks `@OptoCloud <https://github.com/OptoCloud>`_. + 7.1.0 - 2020-10-25 ------------------ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/doc/build.py new/fmt-7.1.2/doc/build.py --- old/fmt-7.1.0/doc/build.py 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/doc/build.py 2020-11-04 15:50:09.000000000 +0100 @@ -6,7 +6,7 @@ from subprocess import check_call, check_output, CalledProcessError, Popen, PIPE from distutils.version import LooseVersion -versions = ['1.0.0', '1.1.0', '2.0.0', '3.0.2', '4.0.0', '4.1.0', '5.0.0', '5.1.0', '5.2.0', '5.2.1', '5.3.0', '6.0.0', '6.1.0', '6.1.1', '6.1.2', '6.2.0', '6.2.1', '7.0.0', '7.0.1', '7.0.2', '7.0.3', '7.1.0'] +versions = ['1.0.0', '1.1.0', '2.0.0', '3.0.2', '4.0.0', '4.1.0', '5.0.0', '5.1.0', '5.2.0', '5.2.1', '5.3.0', '6.0.0', '6.1.0', '6.1.1', '6.1.2', '6.2.0', '6.2.1', '7.0.0', '7.0.1', '7.0.2', '7.0.3', '7.1.0', '7.1.1', '7.1.2'] def pip_install(package, commit=None, **kwargs): "Install package using pip." diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/include/fmt/color.h new/fmt-7.1.2/include/fmt/color.h --- old/fmt-7.1.0/include/fmt/color.h 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/include/fmt/color.h 2020-11-04 15:50:09.000000000 +0100 @@ -589,10 +589,11 @@ \endrst */ template <typename OutputIt, typename S, typename... Args, - FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char_t<S>>::value&& - detail::is_string<S>::value)> -inline OutputIt format_to(OutputIt out, const text_style& ts, - const S& format_str, Args&&... args) { + bool enable = detail::is_output_iterator<OutputIt, char_t<S>>::value&& + detail::is_string<S>::value> +inline auto format_to(OutputIt out, const text_style& ts, const S& format_str, + Args&&... args) -> + typename std::enable_if<enable, OutputIt>::type { return vformat_to(out, ts, to_string_view(format_str), fmt::make_args_checked<Args...>(format_str, args...)); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/include/fmt/compile.h new/fmt-7.1.2/include/fmt/compile.h --- old/fmt-7.1.0/include/fmt/compile.h 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/include/fmt/compile.h 2020-11-04 15:50:09.000000000 +0100 @@ -667,14 +667,15 @@ return format_to(out, compiled, args...); } -template <typename OutputIt, typename CompiledFormat, typename... Args, - FMT_ENABLE_IF(detail::is_output_iterator< - OutputIt, typename CompiledFormat::char_type>::value&& - std::is_base_of<detail::basic_compiled_format, - CompiledFormat>::value)> -format_to_n_result<OutputIt> format_to_n(OutputIt out, size_t n, - const CompiledFormat& cf, - const Args&... args) { +template <typename OutputIt, typename CompiledFormat, typename... Args> +auto format_to_n(OutputIt out, size_t n, const CompiledFormat& cf, + const Args&... args) -> + typename std::enable_if< + detail::is_output_iterator<OutputIt, + typename CompiledFormat::char_type>::value && + std::is_base_of<detail::basic_compiled_format, + CompiledFormat>::value, + format_to_n_result<OutputIt>>::type { auto it = format_to(detail::truncating_iterator<OutputIt>(out, n), cf, args...); return {it.base(), it.count()}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/include/fmt/core.h new/fmt-7.1.2/include/fmt/core.h --- old/fmt-7.1.0/include/fmt/core.h 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/include/fmt/core.h 2020-11-04 15:50:09.000000000 +0100 @@ -18,7 +18,7 @@ #include <vector> // The fmt library version in the form major * 10000 + minor * 100 + patch. -#define FMT_VERSION 70100 +#define FMT_VERSION 70102 #ifdef __clang__ # define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__) @@ -1929,7 +1929,14 @@ } }; -/** An alias to ``basic_format_args<context>``. */ +#ifdef FMT_ARM_ABI_COMPATIBILITY +/** An alias to ``basic_format_args<format_context>``. */ +// Separate types would result in shorter symbols but break ABI compatibility +// between clang and gcc on ARM (#1919). +using format_args = basic_format_args<format_context>; +using wformat_args = basic_format_args<wformat_context>; +#else +// DEPRECATED! These are kept for ABI compatibility. // It is a separate type rather than an alias to make symbols readable. struct format_args : basic_format_args<format_context> { template <typename... Args> @@ -1938,6 +1945,7 @@ struct wformat_args : basic_format_args<wformat_context> { using basic_format_args::basic_format_args; }; +#endif namespace detail { @@ -1968,10 +1976,10 @@ // GCC 8 and earlier cannot handle std::back_insert_iterator<Container> with // vformat_to<ArgFormatter>(...) overload, so SFINAE on iterator type instead. template <typename OutputIt, typename S, typename Char = char_t<S>, - FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value)> -OutputIt vformat_to( - OutputIt out, const S& format_str, - basic_format_args<buffer_context<type_identity_t<Char>>> args) { + bool enable = detail::is_output_iterator<OutputIt, Char>::value> +auto vformat_to(OutputIt out, const S& format_str, + basic_format_args<buffer_context<type_identity_t<Char>>> args) + -> typename std::enable_if<enable, OutputIt>::type { decltype(detail::get_buffer<Char>(out)) buf(detail::get_buffer_init(out)); detail::vformat_to(buf, to_string_view(format_str), args); return detail::get_iterator(buf); @@ -2023,10 +2031,10 @@ \endrst */ template <typename OutputIt, typename S, typename... Args, - FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, char_t<S>>::value)> -inline format_to_n_result<OutputIt> format_to_n(OutputIt out, size_t n, - const S& format_str, - const Args&... args) { + bool enable = detail::is_output_iterator<OutputIt, char_t<S>>::value> +inline auto format_to_n(OutputIt out, size_t n, const S& format_str, + const Args&... args) -> + typename std::enable_if<enable, format_to_n_result<OutputIt>>::type { const auto& vargs = fmt::make_args_checked<Args...>(format_str, args...); return vformat_to_n(out, n, to_string_view(format_str), vargs); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/include/fmt/format-inl.h new/fmt-7.1.2/include/fmt/format-inl.h --- old/fmt-7.1.0/include/fmt/format-inl.h 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/include/fmt/format-inl.h 2020-11-04 15:50:09.000000000 +0100 @@ -261,11 +261,19 @@ 10000000000000000000ULL}; template <typename T> -const uint32_t basic_data<T>::zero_or_powers_of_10_32[] = {0, 0, +const uint32_t basic_data<T>::zero_or_powers_of_10_32[] = {0, FMT_POWERS_OF_10(1)}; - template <typename T> const uint64_t basic_data<T>::zero_or_powers_of_10_64[] = { + 0, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + +template <typename T> +const uint32_t basic_data<T>::zero_or_powers_of_10_32_new[] = { + 0, 0, FMT_POWERS_OF_10(1)}; + +template <typename T> +const uint64_t basic_data<T>::zero_or_powers_of_10_64_new[] = { 0, 0, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), 10000000000000000000ULL}; @@ -1756,7 +1764,7 @@ #ifdef FMT_BUILTIN_CTZLL return FMT_BUILTIN_CTZLL(x) >= exp; #else - return exp < num_bits<uint64_t>()) && x == ((x >> exp) << exp); + return exp < num_bits<uint64_t>() && x == ((x >> exp) << exp); #endif } @@ -1901,7 +1909,7 @@ uint64_t pow5 = data::powers_of_5_64[offset]; uint128_wrapper recovered_cache = umul128(base_cache.high(), pow5); uint128_wrapper middle_low = - umul128(base_cache.low() - (kb < 0 ? 1 : 0), pow5); + umul128(base_cache.low() - (kb < 0 ? 1u : 0u), pow5); recovered_cache += middle_low.high(); @@ -2329,7 +2337,7 @@ upper = &upper_store; } denominator.assign_pow10(exp10); - denominator <<= 1; + denominator <<= shift; } else if (exp10 < 0) { numerator.assign_pow10(-exp10); lower.assign(numerator); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/include/fmt/format.h new/fmt-7.1.2/include/fmt/format.h --- old/fmt-7.1.0/include/fmt/format.h 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/include/fmt/format.h 2020-11-04 15:50:09.000000000 +0100 @@ -866,8 +866,8 @@ // Static data is placed in this class template for the header-only config. template <typename T = void> struct FMT_EXTERN_TEMPLATE_API basic_data { static const uint64_t powers_of_10_64[]; - static const uint32_t zero_or_powers_of_10_32[]; - static const uint64_t zero_or_powers_of_10_64[]; + static const uint32_t zero_or_powers_of_10_32_new[]; + static const uint64_t zero_or_powers_of_10_64_new[]; static const uint64_t grisu_pow10_significands[]; static const int16_t grisu_pow10_exponents[]; static const divtest_table_entry<uint32_t> divtest_table_for_pow5_32[]; @@ -891,6 +891,10 @@ static const char signs[]; static const char left_padding_shifts[5]; static const char right_padding_shifts[5]; + + // DEPRECATED! These are for ABI compatibility. + static const uint32_t zero_or_powers_of_10_32[]; + static const uint64_t zero_or_powers_of_10_64[]; }; // Maps bsr(n) to ceil(log10(pow(2, bsr(n) + 1) - 1)). @@ -917,7 +921,7 @@ inline int count_digits(uint64_t n) { // https://github.com/fmtlib/format-benchmark/blob/master/digits10 auto t = bsr2log10(FMT_BUILTIN_CLZLL(n | 1) ^ 63); - return t - (n < data::zero_or_powers_of_10_64[t]); + return t - (n < data::zero_or_powers_of_10_64_new[t]); } #else // Fallback version of count_digits used when __builtin_clz is not available. @@ -984,7 +988,7 @@ // Optional version of count_digits for better performance on 32-bit platforms. inline int count_digits(uint32_t n) { auto t = bsr2log10(FMT_BUILTIN_CLZ(n | 1) ^ 31); - return t - (n < data::zero_or_powers_of_10_32[t]); + return t - (n < data::zero_or_powers_of_10_32_new[t]); } #endif @@ -3056,8 +3060,7 @@ basic_format_parse_context<Char> parse_context; Context context; - format_handler(OutputIt out, - basic_string_view<Char> str, + format_handler(OutputIt out, basic_string_view<Char> str, basic_format_args<Context> format_args, detail::locale_ref loc) : parse_context(str), context(out, format_args, loc) {} @@ -3080,8 +3083,8 @@ FMT_INLINE void on_replacement_field(int id, const Char*) { auto arg = get_arg(context, id); context.advance_to(visit_format_arg( - default_arg_formatter<OutputIt, Char>{ - context.out(), context.args(), context.locale()}, + default_arg_formatter<OutputIt, Char>{context.out(), context.args(), + context.locale()}, arg)); } @@ -3105,8 +3108,8 @@ if (begin == end || *begin != '}') on_error("missing '}' in format string"); } - context.advance_to( - visit_format_arg(arg_formatter<OutputIt, Char>(context, &parse_context, &specs), arg)); + context.advance_to(visit_format_arg( + arg_formatter<OutputIt, Char>(context, &parse_context, &specs), arg)); return begin; } }; @@ -3776,8 +3779,8 @@ arg); return; } - format_handler<iterator, Char, buffer_context<Char>> h( - out, format_str, args, loc); + format_handler<iterator, Char, buffer_context<Char>> h(out, format_str, args, + loc); parse_format_string<false>(format_str, h); } @@ -3786,6 +3789,7 @@ basic_format_args<format_context>, detail::locale_ref); namespace detail { + extern template FMT_API std::string grouping_impl<char>(locale_ref loc); extern template FMT_API std::string grouping_impl<wchar_t>(locale_ref loc); extern template FMT_API char thousands_sep_impl<char>(locale_ref loc); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/include/fmt/locale.h new/fmt-7.1.2/include/fmt/locale.h --- old/fmt-7.1.0/include/fmt/locale.h 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/include/fmt/locale.h 2020-11-04 15:50:09.000000000 +0100 @@ -51,10 +51,10 @@ } template <typename OutputIt, typename S, typename... Args, - typename Char = char_t<S>, - FMT_ENABLE_IF(detail::is_output_iterator<OutputIt, Char>::value)> -inline OutputIt format_to(OutputIt out, const std::locale& loc, - const S& format_str, Args&&... args) { + bool enable = detail::is_output_iterator<OutputIt, char_t<S>>::value> +inline auto format_to(OutputIt out, const std::locale& loc, + const S& format_str, Args&&... args) -> + typename std::enable_if<enable, OutputIt>::type { const auto& vargs = fmt::make_args_checked<Args...>(format_str, args...); return vformat_to(out, loc, to_string_view(format_str), vargs); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/src/format.cc new/fmt-7.1.2/src/format.cc --- old/fmt-7.1.0/src/format.cc 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/src/format.cc 2020-11-04 15:50:09.000000000 +0100 @@ -23,6 +23,36 @@ return precision < 0 ? snprintf_ptr(buf, size, format, value) : snprintf_ptr(buf, size, format, precision, value); } + +template dragonbox::decimal_fp<float> dragonbox::to_decimal(float x) + FMT_NOEXCEPT; +template dragonbox::decimal_fp<double> dragonbox::to_decimal(double x) + FMT_NOEXCEPT; + +// DEPRECATED! This function exists for ABI compatibility. +template <typename Char> +typename basic_format_context<std::back_insert_iterator<buffer<Char>>, + Char>::iterator +vformat_to(buffer<Char>& buf, basic_string_view<Char> format_str, + basic_format_args<basic_format_context< + std::back_insert_iterator<buffer<type_identity_t<Char>>>, + type_identity_t<Char>>> + args) { + using iterator = std::back_insert_iterator<buffer<char>>; + using context = basic_format_context< + std::back_insert_iterator<buffer<type_identity_t<Char>>>, + type_identity_t<Char>>; + auto out = iterator(buf); + format_handler<iterator, Char, context> h(out, format_str, args, {}); + parse_format_string<false>(format_str, h); + return out; +} +template basic_format_context<std::back_insert_iterator<buffer<char>>, + char>::iterator +vformat_to(buffer<char>&, string_view, + basic_format_args<basic_format_context< + std::back_insert_iterator<buffer<type_identity_t<char>>>, + type_identity_t<char>>>); } // namespace detail template struct FMT_INSTANTIATION_DEF_API detail::basic_data<void>; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fmt-7.1.0/test/format-test.cc new/fmt-7.1.2/test/format-test.cc --- old/fmt-7.1.0/test/format-test.cc 2020-10-25 18:44:22.000000000 +0100 +++ new/fmt-7.1.2/test/format-test.cc 2020-11-04 15:50:09.000000000 +0100 @@ -1270,6 +1270,8 @@ EXPECT_EQ(buffer, format("{:a}", -42.0)); safe_sprintf(buffer, "%A", -42.0); EXPECT_EQ(buffer, format("{:A}", -42.0)); + EXPECT_EQ("9223372036854775808.000000", + format("{:f}", 9223372036854775807.0)); } TEST(FormatterTest, PrecisionRounding) {