P0935R0 Eradicating unnecessarily explicit default constructors
authorJonathan Wakely <jwakely@redhat.com>
Thu, 14 Jun 2018 14:12:24 +0000 (15:12 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 14 Jun 2018 14:12:24 +0000 (15:12 +0100)
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
libstdc++-v3/include/backward/strstream
libstdc++-v3/include/bits/locale_conv.h
libstdc++-v3/include/bits/regex.h
libstdc++-v3/testsuite/22_locale/conversions/buffer/1.cc
libstdc++-v3/testsuite/22_locale/conversions/string/1.cc
libstdc++-v3/testsuite/28_regex/match_results/ctors/char/default.cc
libstdc++-v3/testsuite/28_regex/match_results/ctors/wchar_t/default.cc

index 5f612239bb8f89fde25614084ae2c608595af8f7..94541d1a68dcad84319745536b85d815dacc91bf 100644 (file)
@@ -1,5 +1,17 @@
 2018-06-14  Jonathan Wakely  <jwakely@redhat.com>
 
+       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 <utility> and change type to long.
        * include/std/utility (__cpp_lib_tuple_element_t): Remove.
index 0429c28ce356904452c95a869ca6059c706289a3..566ad8cd1301e8a91f98736b723e2b703ba43676 100644 (file)
@@ -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 ();
index bc5669f25210e206eb63a54c3f0a9d24932d38df..e9b684b4f98850f0152861a8189b230ef77bea87 100644 (file)
@@ -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)
       {
index 674be9ac50c088ca00bb902aadf815bad01cebd7..6b6501e98ae546b967b5f2e2a7ffcb8b34152d7c 100644 (file)
@@ -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.
        */
index 5d0c664679b006f997edde28f91488f85f1e8ea9..0f3f9ffb35a646c41ec14c35fb39fa03329a0549 100644 (file)
@@ -22,6 +22,7 @@
 #include <locale>
 #include <sstream>
 #include <testsuite_hooks.h>
+#include <testsuite_common_types.h>
 
 template<typename Elem>
 struct cvt : std::codecvt<Elem, char, std::mbstate_t> { };
@@ -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()<buf_conv<wchar_t>>(); // P0935R0
 }
 
 void test02()
index ff260267e87e52b30e7156a0b8e9be24acc13fcc..a2a8641d520f046aa92200f6379de5c481f19771 100644 (file)
@@ -22,6 +22,7 @@
 #include <locale>
 #include <string>
 #include <testsuite_hooks.h>
+#include <testsuite_common_types.h>
 
 template<typename Elem>
 struct cvt : std::codecvt<Elem, char, std::mbstate_t> { };
@@ -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()<sc>(); // 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()<wsc>(); // P0935R0
 }
 
 int main()
index 6708c82943c4b7a72ded387be29e4d9e5bce16a6..1023ad44d3e7d1b44529d0fabe671c821760b820 100644 (file)
@@ -23,8 +23,9 @@
 
 #include <regex>
 #include <testsuite_hooks.h>
+#include <testsuite_common_types.h>
 
-// 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()<std::cmatch>();
+  test.operator()<std::smatch>();
+}
+
 int
 main()
-{ 
+{
   test01();
   test02();
-  return 0;
+  test03();
 }
index 37bf58085c47bc6e4e41fe33cb2f43fe7d69aa5e..f533f0ed402627dd5bc64a489d76f4c2bb59b6d0 100644 (file)
@@ -23,8 +23,9 @@
 
 #include <regex>
 #include <testsuite_hooks.h>
+#include <testsuite_common_types.h>
 
-// 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()<std::wcmatch>();
+  test.operator()<std::wsmatch>();
+}
+
 int
 main()
-{ 
+{
   test01();
   test02();
-  return 0;
+  test03();
 }