From e9ecac306b972a45e2a6a4385bdf2bdc7f7ed68c Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Thu, 14 Jun 2018 15:12:24 +0100 Subject: [PATCH] P0935R0 Eradicating unnecessarily explicit default constructors More pieces of P0935R0, making default constructors non-explicit. * include/backward/strstream (strstreambuf): Add non-explicit default constructor. * include/bits/locale_conv.h (wbuffer_convert, wstring_convert): Likewise. * include/bits/regex.h (match_results): Likewise. * testsuite/22_locale/conversions/buffer/1.cc: Test for non-explicit default constructor. * testsuite/22_locale/conversions/string/1.cc: Likewise. * testsuite/28_regex/match_results/ctors/char/default.cc: Likewise. * testsuite/28_regex/match_results/ctors/wchar_t/default.cc: Likewise. From-SVN: r261597 --- libstdc++-v3/ChangeLog | 12 ++++++++++++ libstdc++-v3/include/backward/strstream | 5 +++++ libstdc++-v3/include/bits/locale_conv.h | 14 ++++++++++---- libstdc++-v3/include/bits/regex.h | 7 ++++++- .../testsuite/22_locale/conversions/buffer/1.cc | 4 ++++ .../testsuite/22_locale/conversions/string/1.cc | 7 +++++++ .../28_regex/match_results/ctors/char/default.cc | 15 ++++++++++++--- .../match_results/ctors/wchar_t/default.cc | 15 ++++++++++++--- 8 files changed, 68 insertions(+), 11 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 5f612239bb8..94541d1a68d 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,17 @@ 2018-06-14 Jonathan Wakely + P0935R0 Eradicating unnecessarily explicit default constructors + * include/backward/strstream (strstreambuf): Add non-explicit default + constructor. + * include/bits/locale_conv.h (wbuffer_convert, wstring_convert): + Likewise. + * include/bits/regex.h (match_results): Likewise. + * testsuite/22_locale/conversions/buffer/1.cc: Test for non-explicit + default constructor. + * testsuite/22_locale/conversions/string/1.cc: Likewise. + * testsuite/28_regex/match_results/ctors/char/default.cc: Likewise. + * testsuite/28_regex/match_results/ctors/wchar_t/default.cc: Likewise. + * include/std/tuple (__cpp_lib_tuple_element_t): Move feature test macro from and change type to long. * include/std/utility (__cpp_lib_tuple_element_t): Remove. diff --git a/libstdc++-v3/include/backward/strstream b/libstdc++-v3/include/backward/strstream index 0429c28ce35..566ad8cd130 100644 --- a/libstdc++-v3/include/backward/strstream +++ b/libstdc++-v3/include/backward/strstream @@ -68,7 +68,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION public: // Constructor, destructor +#if __cplusplus >= 201103L + strstreambuf() : strstreambuf(0) { } + explicit strstreambuf(streamsize __initial_capacity); +#else explicit strstreambuf(streamsize __initial_capacity = 0); +#endif strstreambuf(void* (*__alloc)(size_t), void (*__free)(void*)); strstreambuf(char* __get, streamsize __n, char* __put = 0) throw (); diff --git a/libstdc++-v3/include/bits/locale_conv.h b/libstdc++-v3/include/bits/locale_conv.h index bc5669f2521..e9b684b4f98 100644 --- a/libstdc++-v3/include/bits/locale_conv.h +++ b/libstdc++-v3/include/bits/locale_conv.h @@ -174,14 +174,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 typedef typename _Codecvt::state_type state_type; typedef typename wide_string::traits_type::int_type int_type; - /** Default constructor. + /// Default constructor. + wstring_convert() : _M_cvt(new _Codecvt()) { } + + /** Constructor. * * @param __pcvt The facet to use for conversions. * * Takes ownership of @p __pcvt and will delete it in the destructor. */ explicit - wstring_convert(_Codecvt* __pcvt = new _Codecvt()) : _M_cvt(__pcvt) + wstring_convert(_Codecvt* __pcvt) : _M_cvt(__pcvt) { if (!_M_cvt) __throw_logic_error("wstring_convert"); @@ -325,7 +328,10 @@ _GLIBCXX_END_NAMESPACE_CXX11 public: typedef typename _Codecvt::state_type state_type; - /** Default constructor. + /// Default constructor. + wbuffer_convert() : wbuffer_convert(nullptr) { } + + /** Constructor. * * @param __bytebuf The underlying byte stream buffer. * @param __pcvt The facet to use for conversions. @@ -334,7 +340,7 @@ _GLIBCXX_END_NAMESPACE_CXX11 * Takes ownership of @p __pcvt and will delete it in the destructor. */ explicit - wbuffer_convert(streambuf* __bytebuf = 0, _Codecvt* __pcvt = new _Codecvt, + wbuffer_convert(streambuf* __bytebuf, _Codecvt* __pcvt = new _Codecvt, state_type __state = state_type()) : _M_buf(__bytebuf), _M_cvt(__pcvt), _M_state(__state) { diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 674be9ac50c..6b6501e98ae 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -1600,12 +1600,17 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 /** * @brief Constructs a default %match_results container. * @post size() returns 0 and str() returns an empty string. + * @{ */ + match_results() : match_results(_Alloc()) { } + explicit - match_results(const _Alloc& __a = _Alloc()) noexcept + match_results(const _Alloc& __a) noexcept : _Base_type(__a) { } + // @} + /** * @brief Copy constructs a %match_results. */ diff --git a/libstdc++-v3/testsuite/22_locale/conversions/buffer/1.cc b/libstdc++-v3/testsuite/22_locale/conversions/buffer/1.cc index 5d0c664679b..0f3f9ffb35a 100644 --- a/libstdc++-v3/testsuite/22_locale/conversions/buffer/1.cc +++ b/libstdc++-v3/testsuite/22_locale/conversions/buffer/1.cc @@ -22,6 +22,7 @@ #include #include #include +#include template struct cvt : std::codecvt { }; @@ -42,6 +43,9 @@ void test01() VERIFY( buf.rdbuf(&sbuf) == nullptr ); VERIFY( buf.rdbuf() == &sbuf ); VERIFY( buf.rdbuf(nullptr) == &sbuf ); + + __gnu_test::implicitly_default_constructible test; + test.operator()>(); // P0935R0 } void test02() diff --git a/libstdc++-v3/testsuite/22_locale/conversions/string/1.cc b/libstdc++-v3/testsuite/22_locale/conversions/string/1.cc index ff260267e87..a2a8641d520 100644 --- a/libstdc++-v3/testsuite/22_locale/conversions/string/1.cc +++ b/libstdc++-v3/testsuite/22_locale/conversions/string/1.cc @@ -22,6 +22,7 @@ #include #include #include +#include template struct cvt : std::codecvt { }; @@ -43,6 +44,9 @@ void test01() string roundtrip = c.to_bytes(output); VERIFY( input == roundtrip ); VERIFY( c.converted() == roundtrip.length() ); + + __gnu_test::implicitly_default_constructible test; + test.operator()(); // P0935R0 } void test02() @@ -64,6 +68,9 @@ void test02() VERIFY( c.to_bytes(output[0]) == input.substr(0, 1) ); VERIFY( c.to_bytes(output.c_str()) == input ); VERIFY( c.to_bytes(output.data(), output.data()+output.size()) == input ); + + __gnu_test::implicitly_default_constructible test; + test.operator()(); // P0935R0 } int main() diff --git a/libstdc++-v3/testsuite/28_regex/match_results/ctors/char/default.cc b/libstdc++-v3/testsuite/28_regex/match_results/ctors/char/default.cc index 6708c82943c..1023ad44d3e 100644 --- a/libstdc++-v3/testsuite/28_regex/match_results/ctors/char/default.cc +++ b/libstdc++-v3/testsuite/28_regex/match_results/ctors/char/default.cc @@ -23,8 +23,9 @@ #include #include +#include -// Tests default constructor of the match_result class. +// Tests default constructor of the match_result class. void test01() { std::cmatch cm; @@ -43,10 +44,18 @@ void test02() VERIFY( sm.begin() == sm.end() ); // PR libstdc++/83600 } +void test03() +{ + // P0935R0 + __gnu_test::implicitly_default_constructible test; + test.operator()(); + test.operator()(); +} + int main() -{ +{ test01(); test02(); - return 0; + test03(); } diff --git a/libstdc++-v3/testsuite/28_regex/match_results/ctors/wchar_t/default.cc b/libstdc++-v3/testsuite/28_regex/match_results/ctors/wchar_t/default.cc index 37bf58085c4..f533f0ed402 100644 --- a/libstdc++-v3/testsuite/28_regex/match_results/ctors/wchar_t/default.cc +++ b/libstdc++-v3/testsuite/28_regex/match_results/ctors/wchar_t/default.cc @@ -23,8 +23,9 @@ #include #include +#include -// Tests default constructor of the match_result class. +// Tests default constructor of the match_result class. void test01() { std::wcmatch cm; @@ -43,10 +44,18 @@ void test02() VERIFY( sm.begin() == sm.end() ); // PR libstdc++/83600 } +void test03() +{ + // P0935R0 + __gnu_test::implicitly_default_constructible test; + test.operator()(); + test.operator()(); +} + int main() -{ +{ test01(); test02(); - return 0; + test03(); } -- 2.30.2