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)

Reply via email to