From 97271bd88f1c0ea8bf66b68bfbb00c13355e9706 Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 6 Jul 2018 13:39:02 +0100 Subject: [PATCH] P0935R0 Eradicating unnecessarily explicit default constructors This is the last remaining piece of P0935R0. This adds a default constructor to each of the streambuf and stream types in so that default construction does not use the 'explicit' constructor that has a single, defaulted argument. P0935R0 Eradicating unnecessarily explicit default constructors * config/abi/pre/gnu.ver: Tighten existing patterns and export new default constructor symbols. * include/std/sstream (basic_stringbuf, basic_istringstream) (basic_ostringstream, basic_stringstream): Remove default arguments from explicit constructors taking ios_base::openmode and add separate non-explicit default constructors. * testsuite/27_io/basic_istringstream/cons/default.cc: New. * testsuite/27_io/basic_ostringstream/cons/default.cc: New. * testsuite/27_io/basic_stringstream/cons/default.cc: New. * testsuite/27_io/basic_stringbuf/cons/char/default.cc: New. * testsuite/27_io/basic_stringbuf/cons/wchar_t/default.cc: New. From-SVN: r262474 --- libstdc++-v3/ChangeLog | 13 ++++ libstdc++-v3/config/abi/pre/gnu.ver | 26 ++++++-- libstdc++-v3/include/std/sstream | 66 +++++++++++++++++-- .../27_io/basic_istringstream/cons/default.cc | 35 ++++++++++ .../27_io/basic_ostringstream/cons/default.cc | 35 ++++++++++ .../basic_stringbuf/cons/char/default.cc | 35 ++++++++++ .../basic_stringbuf/cons/wchar_t/default.cc | 35 ++++++++++ .../27_io/basic_stringstream/cons/default.cc | 35 ++++++++++ 8 files changed, 269 insertions(+), 11 deletions(-) create mode 100644 libstdc++-v3/testsuite/27_io/basic_istringstream/cons/default.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/default.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/default.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/default.cc create mode 100644 libstdc++-v3/testsuite/27_io/basic_stringstream/cons/default.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 30fe76958f0..733c831aa6a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,18 @@ 2018-07-06 Jonathan Wakely + P0935R0 Eradicating unnecessarily explicit default constructors + * config/abi/pre/gnu.ver: Tighten existing patterns and export new + default constructor symbols. + * include/std/sstream (basic_stringbuf, basic_istringstream) + (basic_ostringstream, basic_stringstream): Remove default arguments + from explicit constructors taking ios_base::openmode and add separate + non-explicit default constructors. + * testsuite/27_io/basic_istringstream/cons/default.cc: New. + * testsuite/27_io/basic_ostringstream/cons/default.cc: New. + * testsuite/27_io/basic_stringstream/cons/default.cc: New. + * testsuite/27_io/basic_stringbuf/cons/char/default.cc: New. + * testsuite/27_io/basic_stringbuf/cons/wchar_t/default.cc: New. + * include/std/variant (__accepted_index): Use void_t. 2018-07-05 Jonathan Wakely diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver index 521cebf1f80..e634d3ab707 100644 --- a/libstdc++-v3/config/abi/pre/gnu.ver +++ b/libstdc++-v3/config/abi/pre/gnu.ver @@ -1748,10 +1748,20 @@ GLIBCXX_3.4.21 { _ZStplI[cw]St11char_traitsI[cw]ESaI[cw]EENSt7__cxx1112basic_stringIT_T0_T1_EE*; # ABI-tagged stringstreams - _ZNSt7__cxx1115basic_stringbuf*; - _ZNSt7__cxx1118basic_stringstream*; - _ZNSt7__cxx1119basic_istringstream*; - _ZNSt7__cxx1119basic_ostringstream*; +# _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]*; + _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]E[ORS]*; + _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EED[012]Ev; + _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]*__xfer_bufptrs*; + _ZNSt7__cxx1115basic_stringbufI[cw]St11char_traitsI[cw]ESaI[cw]EE[a1346789]*; +# _ZNSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]*; + _ZNSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]E[ORS]*; + _ZNSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EED[012]Ev; + _ZNSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE[a34]*; +# _ZNSt7__cxx1119basic_istringstreamI[cw]St11char_traitsI[cw]*; +# _ZNSt7__cxx1119basic_ostringstreamI[cw]St11char_traitsI[cw]*; + _ZNSt7__cxx1119basic_[io]stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]E[ORS]*; + _ZNSt7__cxx1119basic_[io]stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EED[012]Ev; + _ZNSt7__cxx1119basic_[io]stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EE[a34]*; _ZNKSt7__cxx1115basic_stringbuf*; _ZNKSt7__cxx1118basic_stringstream*; _ZNKSt7__cxx1119basic_istringstream*; @@ -2021,6 +2031,14 @@ GLIBCXX_3.4.26 { _ZNSt13runtime_errorC[12]EOS_; _ZNSt13runtime_erroraSEOS_; + # Default constructors for stringstreams + _ZNSt15basic_stringbuf[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]Ev; + _ZNSt18basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]Ev; + _ZNSt19basic_[io]stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]Ev; + _ZNSt7__cxx1115basic_stringbuf[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]Ev; + _ZNSt7__cxx1118basic_stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]Ev; + _ZNSt7__cxx1119basic_[io]stringstreamI[cw]St11char_traitsI[cw]ESaI[cw]EEC[12]Ev; + } GLIBCXX_3.4.25; # Symbols in the support library (libsupc++) have their own tag. diff --git a/libstdc++-v3/include/std/sstream b/libstdc++-v3/include/std/sstream index 8ad18d00fb6..71d69e94b65 100644 --- a/libstdc++-v3/include/std/sstream +++ b/libstdc++-v3/include/std/sstream @@ -89,6 +89,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 public: // Constructors: + + /** + * @brief Starts with an empty string buffer. + * + * The default constructor initializes the parent class using its + * own default ctor. + */ + basic_stringbuf() + : __streambuf_type(), _M_mode(ios_base::in | ios_base::out), _M_string() + { } + /** * @brief Starts with an empty string buffer. * @param __mode Whether the buffer can read, or write, or both. @@ -97,7 +108,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 * own default ctor. */ explicit - basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out) + basic_stringbuf(ios_base::openmode __mode) : __streambuf_type(), _M_mode(__mode), _M_string() { } @@ -401,8 +412,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 public: // Constructors: + /** * @brief Default constructor starts with an empty string buffer. + * + * Initializes @c sb using @c in, and passes @c &sb to the base + * class initializer. Does not allocate any buffer. + * + * That's a lie. We initialize the base class with NULL, because the + * string class does its own memory management. + */ + basic_istringstream() + : __istream_type(), _M_stringbuf(ios_base::in) + { this->init(&_M_stringbuf); } + + /** + * @brief Starts with an empty string buffer. * @param __mode Whether the buffer can read, or write, or both. * * @c ios_base::in is automatically included in @a __mode. @@ -414,7 +439,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 * string class does its own memory management. */ explicit - basic_istringstream(ios_base::openmode __mode = ios_base::in) + basic_istringstream(ios_base::openmode __mode) : __istream_type(), _M_stringbuf(__mode | ios_base::in) { this->init(&_M_stringbuf); } @@ -545,8 +570,22 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 public: // Constructors/destructor: + /** * @brief Default constructor starts with an empty string buffer. + * + * Initializes @c sb using @c mode|out, and passes @c &sb to the base + * class initializer. Does not allocate any buffer. + * + * That's a lie. We initialize the base class with NULL, because the + * string class does its own memory management. + */ + basic_ostringstream() + : __ostream_type(), _M_stringbuf(ios_base::out) + { this->init(&_M_stringbuf); } + + /** + * @brief Starts with an empty string buffer. * @param __mode Whether the buffer can read, or write, or both. * * @c ios_base::out is automatically included in @a mode. @@ -558,7 +597,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 * string class does its own memory management. */ explicit - basic_ostringstream(ios_base::openmode __mode = ios_base::out) + basic_ostringstream(ios_base::openmode __mode) : __ostream_type(), _M_stringbuf(__mode | ios_base::out) { this->init(&_M_stringbuf); } @@ -689,19 +728,32 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 public: // Constructors/destructors + /** * @brief Default constructor starts with an empty string buffer. + * + * Initializes @c sb using the mode @c in|out, and passes @c &sb + * to the base class initializer. Does not allocate any buffer. + * + * That's a lie. We initialize the base class with NULL, because the + * string class does its own memory management. + */ + basic_stringstream() + : __iostream_type(), _M_stringbuf(ios_base::out | ios_base::in) + { this->init(&_M_stringbuf); } + + /** + * @brief Starts with an empty string buffer. * @param __m Whether the buffer can read, or write, or both. * - * Initializes @c sb using the mode from @c __m, and passes @c - * &sb to the base class initializer. Does not allocate any - * buffer. + * Initializes @c sb using the mode from @c __m, and passes @c &sb + * to the base class initializer. Does not allocate any buffer. * * That's a lie. We initialize the base class with NULL, because the * string class does its own memory management. */ explicit - basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in) + basic_stringstream(ios_base::openmode __m) : __iostream_type(), _M_stringbuf(__m) { this->init(&_M_stringbuf); } diff --git a/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/default.cc b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/default.cc new file mode 100644 index 00000000000..020206fcc84 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_istringstream/cons/default.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2018 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 +// . + +// C++11 27.8.3.1 basic_istringstream constructors [istringstream.cons] + +// { dg-do run { target c++11 } } + +#include +#include + +void test01() +{ + // P0935R0 + __gnu_test::implicitly_default_constructible test; + test.operator()(); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/default.cc b/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/default.cc new file mode 100644 index 00000000000..f2768b02992 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_ostringstream/cons/default.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2018 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 +// . + +// C++11 27.8.4.1 basic_ostringstream constructors [ostringstream.cons] + +// { dg-do run { target c++11 } } + +#include +#include + +void test01() +{ + // P0935R0 + __gnu_test::implicitly_default_constructible test; + test.operator()(); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/default.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/default.cc new file mode 100644 index 00000000000..06b242f8295 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/char/default.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2018 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 +// . + +// C++11 27.8.2.1 basic_stringbuf constructors [stringbuf.cons] + +// { dg-do run { target c++11 } } + +#include +#include + +void test01() +{ + // P0935R0 + __gnu_test::implicitly_default_constructible test; + test.operator()(); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/default.cc b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/default.cc new file mode 100644 index 00000000000..6ac75ab65c3 --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_stringbuf/cons/wchar_t/default.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2018 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 +// . + +// C++11 27.8.2.1 basic_stringbuf constructors [stringbuf.cons] + +// { dg-do run { target c++11 } } + +#include +#include + +void test01() +{ + // P0935R0 + __gnu_test::implicitly_default_constructible test; + test.operator()(); +} + +int main() +{ + test01(); +} diff --git a/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/default.cc b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/default.cc new file mode 100644 index 00000000000..0195be15dfb --- /dev/null +++ b/libstdc++-v3/testsuite/27_io/basic_stringstream/cons/default.cc @@ -0,0 +1,35 @@ +// Copyright (C) 2018 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 +// . + +// C++11 27.8.5.1 basic_stringstream constructors [stringstream.cons] + +// { dg-do run { target c++11 } } + +#include +#include + +void test01() +{ + // P0935R0 + __gnu_test::implicitly_default_constructible test; + test.operator()(); +} + +int main() +{ + test01(); +} -- 2.30.2