Tested x86_64-linux.

-- >8 --

This is LWG 4084 which I filed recently. LWG seems to support making the
change, so that std::num_put can use the %F format for floating-point
numbers.

libstdc++-v3/ChangeLog:

        PR libstdc++/114862
        * src/c++98/locale_facets.cc (__num_base::_S_format_float):
        Check uppercase flag for fixed format.
        * testsuite/22_locale/num_put/put/char/lwg4084.cc: New test.
---
 libstdc++-v3/src/c++98/locale_facets.cc       | 13 ++++--
 .../22_locale/num_put/put/char/lwg4084.cc     | 46 +++++++++++++++++++
 2 files changed, 54 insertions(+), 5 deletions(-)
 create mode 100644 libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc

diff --git a/libstdc++-v3/src/c++98/locale_facets.cc 
b/libstdc++-v3/src/c++98/locale_facets.cc
index fa469b1b872..02f53fd5ec1 100644
--- a/libstdc++-v3/src/c++98/locale_facets.cc
+++ b/libstdc++-v3/src/c++98/locale_facets.cc
@@ -84,17 +84,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
     if (__mod)
       *__fptr++ = __mod;
-    // [22.2.2.2.2] Table 58
+    // C++11 [facet.num.put.virtuals] Table 88
+    // _GLIBCXX_RESOLVE_LIB_DEFECTS
+    // 4084. std::fixed ignores std::uppercase
+    bool __upper = __flags & ios_base::uppercase;
     if (__fltfield == ios_base::fixed)
-      *__fptr++ = 'f';
+      *__fptr++ = __upper ? 'F' : 'f';
     else if (__fltfield == ios_base::scientific)
-      *__fptr++ = (__flags & ios_base::uppercase) ? 'E' : 'e';
+      *__fptr++ = __upper ? 'E' : 'e';
 #if _GLIBCXX_USE_C99_STDIO
     else if (__fltfield == (ios_base::fixed | ios_base::scientific))
-      *__fptr++ = (__flags & ios_base::uppercase) ? 'A' : 'a';
+      *__fptr++ = __upper ? 'A' : 'a';
 #endif
     else
-      *__fptr++ = (__flags & ios_base::uppercase) ? 'G' : 'g';
+      *__fptr++ = __upper ? 'G' : 'g';
     *__fptr = '\0';
   }
 
diff --git a/libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc 
b/libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc
new file mode 100644
index 00000000000..b7c7da11f86
--- /dev/null
+++ b/libstdc++-v3/testsuite/22_locale/num_put/put/char/lwg4084.cc
@@ -0,0 +1,46 @@
+// { dg-do run }
+// LWG 4084. std::fixed ignores std::uppercase
+// PR libstdc++/114862 std::uppercase not applying to nan's and inf's
+
+#include <sstream>
+#include <limits>
+#include <iomanip>
+#include <testsuite_hooks.h>
+
+void
+test_nan()
+{
+  std::ostringstream out;
+  double nan = std::numeric_limits<double>::quiet_NaN();
+  out << std::fixed;
+  out << ' ' << nan << ' ' << -nan;
+  out << std::uppercase;
+  out << ' ' << nan << ' ' << -nan;
+  out << std::showpoint;
+  out << ' ' << nan << ' ' << -nan;
+  out << std::showpos;
+  out << ' ' << nan << ' ' << -nan;
+  VERIFY( out.str() == " nan -nan NAN -NAN NAN -NAN +NAN -NAN" );
+}
+
+void
+test_inf()
+{
+  std::ostringstream out;
+  double inf = std::numeric_limits<double>::infinity();
+  out << std::fixed;
+  out << ' ' << inf << ' ' << -inf;
+  out << std::uppercase;
+  out << ' ' << inf << ' ' << -inf;
+  out << std::showpoint;
+  out << ' ' << inf << ' ' << -inf;
+  out << std::showpos;
+  out << ' ' << inf << ' ' << -inf;
+  VERIFY( out.str() == " inf -inf INF -INF INF -INF +INF -INF" );
+}
+
+int main()
+{
+  test_nan();
+  test_inf();
+}
-- 
2.45.2

Reply via email to