On 24/02/21 17:00 +0000, Jonathan Wakely via Libstdc++ wrote:
@@ -815,6 +852,39 @@ template<typename T>
return result;
}
+namespace
+{
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wabi"
+ template<typename T, typename... Extra>
+ inline int
+ sprintf_ld(char* buffer, const char* format_string, T value, Extra... args)
+ {
+ int len;
+
+#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
+ const int saved_rounding_mode = fegetround();
+ if (saved_rounding_mode != FE_TONEAREST)
+ fesetround(FE_TONEAREST); // We want round-to-nearest behavior.
+#endif
+
+#ifdef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT
+ if constexpr (is_same_v<T, __ieee128>)
+ len = __sprintfieee128(buffer, format_string, value, args...);
+ else
+#endif
+ len = sprintf(buffer, format_string, value, args...);
I messed up the order of these arguments here, which caused PR 99261.
Fixed with this patch, tested powerpc64*-linux and x86_64-linux.
Committed to trunk.
commit 94bfe81afedb6dbba877ee7c9f047375366f8996
Author: Jonathan Wakely <jwak...@redhat.com>
Date: Wed Feb 24 22:25:31 2021
libstdc++: Fix order of arguments to sprintf [PR 99261]
libstdc++-v3/ChangeLog:
PR libstdc++/99261
* src/c++17/floating_to_chars.cc (sprintf_ld): Add extra args
before value to be printed.
diff --git a/libstdc++-v3/src/c++17/floating_to_chars.cc b/libstdc++-v3/src/c++17/floating_to_chars.cc
index f1512017aa3..611747bb99e 100644
--- a/libstdc++-v3/src/c++17/floating_to_chars.cc
+++ b/libstdc++-v3/src/c++17/floating_to_chars.cc
@@ -870,10 +870,10 @@ namespace
#ifdef _GLIBCXX_LONG_DOUBLE_ALT128_COMPAT
if constexpr (is_same_v<T, __ieee128>)
- len = __sprintfieee128(buffer, format_string, value, args...);
+ len = __sprintfieee128(buffer, format_string, args..., value);
else
#endif
- len = sprintf(buffer, format_string, value, args...);
+ len = sprintf(buffer, format_string, args..., value);
#if _GLIBCXX_USE_C99_FENV_TR1 && defined(FE_TONEAREST)
if (saved_rounding_mode != FE_TONEAREST)