summaryrefslogtreecommitdiffstats
path: root/libstdc++-v3
diff options
context:
space:
mode:
authoremsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-07 13:39:22 +0000
committeremsr <emsr@138bc75d-0d04-0410-961f-82ee72b054a4>2014-06-07 13:39:22 +0000
commit54c745a1eeb35e2e34b3d3313a96fa275e8b4393 (patch)
treeeefa37117b23ca6fdc39647d7c10b11d99bc622f /libstdc++-v3
parent404c898aaa1cc860a0839e01bd6e80204ab275ad (diff)
downloadppe42-gcc-54c745a1eeb35e2e34b3d3313a96fa275e8b4393.tar.gz
ppe42-gcc-54c745a1eeb35e2e34b3d3313a96fa275e8b4393.zip
2014-06-07 Ed Smith-Rowland <3dw4rd@verizon.net>
Backport from mainline 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@211344 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/ChangeLog8
-rw-r--r--libstdc++-v3/include/std/iomanip38
-rw-r--r--libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc50
-rw-r--r--libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc50
4 files changed, 131 insertions, 15 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 55ccdfaa2b5..762839b7b06 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,11 @@
+2014-06-07 Ed Smith-Rowland <3dw4rd@verizon.net>
+
+ Backport from mainline
+ 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-03 Jonathan Wakely <jwakely@redhat.com>
* include/bits/regex_executor.tcc (_Executor<>::_M_main): Move instead
diff --git a/libstdc++-v3/include/std/iomanip b/libstdc++-v3/include/std/iomanip
index 73822db9b20..cc6f60cdeeb 100644
--- a/libstdc++-v3/include/std/iomanip
+++ b/libstdc++-v3/include/std/iomanip
@@ -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
index 00000000000..e220d35b2be
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/manipulators/standard/char/dr2344.cc
@@ -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
index 00000000000..5bdabacc2f5
--- /dev/null
+++ b/libstdc++-v3/testsuite/27_io/manipulators/standard/wchar_t/dr2344.cc
@@ -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;
+}
OpenPOWER on IntegriCloud