]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
DR 2344 - std::quoted doesn't respect padding
authorEd Smith-Rowland <3dw4rd@verizon.net>
Sat, 7 Jun 2014 03:40:30 +0000 (03:40 +0000)
committerEdward Smith-Rowland <emsr@gcc.gnu.org>
Sat, 7 Jun 2014 03:40:30 +0000 (03:40 +0000)
2014-06-06  Ed Smith-Rowland  <3dw4rd@verizon.net>

DR 2344 - std::quoted doesn't respect padding
* include/std/iomanip: Allow for padding in quoted inserters.
* testsuite/27_io/manipulators/standard/char/dr2344.cc: New.
* testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc: New.

From-SVN: r211340

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/iomanip
libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc [new file with mode: 0644]
libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc [new file with mode: 0644]

index c4f986f1c6b9f21b2c6b3cc1c5e782438d91bc3f..a6ba049e488cb90d67902a94e5134abd452c7f9e 100644 (file)
@@ -1,3 +1,10 @@
+2014-06-06  Ed Smith-Rowland  <3dw4rd@verizon.net>
+
+       DR 2344 - std::quoted doesn't respect padding
+       * include/std/iomanip: Allow for padding in quoted inserters.
+       * testsuite/27_io/manipulators/standard/char/dr2344.cc: New.
+       * testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc: New.
+
 2014-06-06  François Dumont  <fdumont@gcc.gnu.org>
 
        * testsuite/23_containers/map/operators/1.cc: Simplify test.
index 73822db9b20cb5de0c4b29c8f6a219d41ec7318f..cc6f60cdeeba16e0531723ead153b0b5843134a8 100644 (file)
@@ -41,6 +41,9 @@
 
 #if __cplusplus >= 201103L
 #include <locale>
+#if __cplusplus > 201103L
+#include <sstream> // used in quoted.
+#endif
 #endif
 
 namespace std _GLIBCXX_VISIBILITY(default)
@@ -342,7 +345,6 @@ _GLIBCXX_END_NAMESPACE_VERSION
 
     /**
      * @brief Struct for delimited strings.
-     *        The left and right delimiters can be different.
      */
     template<typename _String, typename _CharT>
       struct _Quoted_string
@@ -364,45 +366,51 @@ _GLIBCXX_END_NAMESPACE_VERSION
       };
 
     /**
-     * @brief Inserter for delimited strings.
-     *        The left and right delimiters can be different.
+     * @brief Inserter for quoted strings.
+     *
+     *  _GLIBCXX_RESOLVE_LIB_DEFECTS
+     *  DR 2344 quoted()'s interaction with padding is unclear
      */
     template<typename _CharT, typename _Traits>
       auto&
       operator<<(std::basic_ostream<_CharT, _Traits>& __os,
                 const _Quoted_string<const _CharT*, _CharT>& __str)
       {
-       __os << __str._M_delim;
+       std::basic_ostringstream<_CharT, _Traits> __ostr;
+       __ostr << __str._M_delim;
        for (const _CharT* __c = __str._M_string; *__c; ++__c)
          {
            if (*__c == __str._M_delim || *__c == __str._M_escape)
-             __os << __str._M_escape;
-           __os << *__c;
+             __ostr << __str._M_escape;
+           __ostr << *__c;
          }
-       __os << __str._M_delim;
+       __ostr << __str._M_delim;
 
-       return __os;
+       return __os << __ostr.str();
       }
 
     /**
-     * @brief Inserter for delimited strings.
-     *        The left and right delimiters can be different.
+     * @brief Inserter for quoted strings.
+     *
+     *  _GLIBCXX_RESOLVE_LIB_DEFECTS
+     *  DR 2344 quoted()'s interaction with padding is unclear
      */
     template<typename _CharT, typename _Traits, typename _String>
       auto&
       operator<<(std::basic_ostream<_CharT, _Traits>& __os,
                 const _Quoted_string<_String, _CharT>& __str)
       {
-       __os << __str._M_delim;
+       std::basic_ostringstream<_CharT, _Traits> __ostr;
+       __ostr << __str._M_delim;
        for (auto& __c : __str._M_string)
          {
            if (__c == __str._M_delim || __c == __str._M_escape)
-             __os << __str._M_escape;
-           __os << __c;
+             __ostr << __str._M_escape;
+           __ostr << __c;
          }
-       __os << __str._M_delim;
+       __ostr << __str._M_delim;
 
-       return __os;
+       return __os << __ostr.str();
       }
 
     /**
diff --git a/libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc b/libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc
new file mode 100644 (file)
index 0000000..e220d35
--- /dev/null
@@ -0,0 +1,50 @@
+// { dg-do run }
+// { dg-options "-std=gnu++14" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// 27.7.6 - Quoted manipulators                [quoted.manip]
+
+#include <sstream>
+#include <iomanip>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  bool test [[gnu::unused]] = true;
+
+  std::ostringstream ssx;
+  ssx << "[" << std::left << std::setfill('x') << std::setw(20) << R"("AB \"CD\" EF")" << "]";
+  VERIFY( ssx.str() == R"(["AB \"CD\" EF"xxxxxx])" );
+
+  std::ostringstream ssy;
+  ssy << "[" << std::left << std::setfill('y') << std::setw(20) << std::quoted(R"(GH "IJ" KL)") << "]";
+  VERIFY( ssy.str() == R"(["GH \"IJ\" KL"yyyyyy])" );
+
+  std::ostringstream ssz;
+  ssz << "[" << std::right << std::setfill('z') << std::setw(20) << std::quoted(R"(PQ "RS" TU)") << "]";
+  VERIFY( ssz.str() == R"([zzzzzz"PQ \"RS\" TU"])" );
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}
diff --git a/libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc b/libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc
new file mode 100644 (file)
index 0000000..5bdabac
--- /dev/null
@@ -0,0 +1,50 @@
+// { dg-do run }
+// { dg-options "-std=gnu++14" }
+
+// Copyright (C) 2014 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3.  If not see
+// <http://www.gnu.org/licenses/>.
+
+// 27.7.6 - Quoted manipulators                [quoted.manip]
+
+#include <sstream>
+#include <iomanip>
+#include <testsuite_hooks.h>
+
+void
+test01()
+{
+  bool test [[gnu::unused]] = true;
+
+  std::wostringstream ssx;
+  ssx << L"[" << std::left << std::setfill(L'x') << std::setw(20) << LR"("AB \"CD\" EF")" << L"]";
+  VERIFY( ssx.str() == LR"(["AB \"CD\" EF"xxxxxx])" );
+
+  std::wostringstream ssy;
+  ssy << L"[" << std::left << std::setfill(L'y') << std::setw(20) << std::quoted(LR"(GH "IJ" KL)") << L"]";
+  VERIFY( ssy.str() == LR"(["GH \"IJ\" KL"yyyyyy])" );
+
+  std::wostringstream ssz;
+  ssz << L"[" << std::right << std::setfill(L'z') << std::setw(20) << std::quoted(LR"(PQ "RS" TU)") << L"]";
+  VERIFY( ssz.str() == LR"([zzzzzz"PQ \"RS\" TU"])" );
+}
+
+int
+main()
+{
+  test01();
+  return 0;
+}