Define special members as defaulted

Message ID 20180608163916.GA29180@redhat.com
State New
Headers show
Series
  • Define special members as defaulted
Related show

Commit Message

Jonathan Wakely June 8, 2018, 4:39 p.m.
This adds defaulted definitions for a few more types where implicitly
declaring them is deprecated (as discussed at the WG21 meeting this
week).

	* include/bits/ios_base.h (ios::Init::Init(const Init&))
	(ios::Init::operator=): Define as defaulted.
	* include/bits/stl_bvector.h (_Bit_reference(const _Bit_reference&)):
	Likewise.
	* include/bits/stream_iterator.h (istream_iterator::operator=)
	(ostream_iterator::operator=): Likewise.
	* include/bits/streambuf_iterator.h (istreambuf_iterator::operator=)
	Likewise.
	* include/std/bitset (bitset::reference::reference(const reference&)):
	Likewise.
	* include/std/complex (complex<float>::complex(const complex&))
	(complex<double>::complex(const complex&))
	(complex<long double>::complex(const complex&)): Likewise.

Tested powerpc64le-linux, committed to trunk.
commit 3121248b11c1e5a98e9c6337a864471306796000
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Fri Jun 8 17:02:22 2018 +0100

    Define special members as defaulted
    
            * include/bits/ios_base.h (ios::Init::Init(const Init&))
            (ios::Init::operator=): Define as defaulted.
            * include/bits/stl_bvector.h (_Bit_reference(const _Bit_reference&)):
            Likewise.
            * include/bits/stream_iterator.h (istream_iterator::operator=)
            (ostream_iterator::operator=): Likewise.
            * include/bits/streambuf_iterator.h (istreambuf_iterator::operator=)
            Likewise.
            * include/std/bitset (bitset::reference::reference(const reference&)):
            Likewise.
            * include/std/complex (complex<float>::complex(const complex&))
            (complex<double>::complex(const complex&))
            (complex<long double>::complex(const complex&)): Likewise.

Patch

diff --git a/libstdc++-v3/include/bits/ios_base.h b/libstdc++-v3/include/bits/ios_base.h
index c0c4e3b2abe..819afb96187 100644
--- a/libstdc++-v3/include/bits/ios_base.h
+++ b/libstdc++-v3/include/bits/ios_base.h
@@ -607,6 +607,11 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       Init();
       ~Init();
 
+#if __cplusplus >= 201103L
+      Init(const Init&) = default;
+      Init& operator=(const Init&) = default;
+#endif
+
     private:
       static _Atomic_word	_S_refcount;
       static bool		_S_synced_with_stdio;
diff --git a/libstdc++-v3/include/bits/stl_bvector.h b/libstdc++-v3/include/bits/stl_bvector.h
index 24594044d7a..4527ce7832a 100644
--- a/libstdc++-v3/include/bits/stl_bvector.h
+++ b/libstdc++-v3/include/bits/stl_bvector.h
@@ -79,6 +79,10 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 
     _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
 
+#if __cplusplus >= 201103L
+    _Bit_reference(const _Bit_reference&) = default;
+#endif
+
     operator bool() const _GLIBCXX_NOEXCEPT
     { return !!(*_M_p & _M_mask); }
 
diff --git a/libstdc++-v3/include/bits/stream_iterator.h b/libstdc++-v3/include/bits/stream_iterator.h
index 002310c07a2..7b682d2959e 100644
--- a/libstdc++-v3/include/bits/stream_iterator.h
+++ b/libstdc++-v3/include/bits/stream_iterator.h
@@ -74,6 +74,10 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
         _M_ok(__obj._M_ok)
       { }
 
+#if __cplusplus >= 201103L
+      istream_iterator& operator=(const istream_iterator&) = default;
+#endif
+
       const _Tp&
       operator*() const
       {
@@ -188,6 +192,10 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       ostream_iterator(const ostream_iterator& __obj)
       : _M_stream(__obj._M_stream), _M_string(__obj._M_string)  { }
 
+#if __cplusplus >= 201103L
+      ostream_iterator& operator=(const ostream_iterator&) = default;
+#endif
+
       /// Writes @a value to underlying ostream using operator<<.  If
       /// constructed with delimiter string, writes delimiter to ostream.
       ostream_iterator&
diff --git a/libstdc++-v3/include/bits/streambuf_iterator.h b/libstdc++-v3/include/bits/streambuf_iterator.h
index 292ef3a5335..8a3a382325a 100644
--- a/libstdc++-v3/include/bits/streambuf_iterator.h
+++ b/libstdc++-v3/include/bits/streambuf_iterator.h
@@ -121,6 +121,11 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       istreambuf_iterator(streambuf_type* __s) _GLIBCXX_USE_NOEXCEPT
       : _M_sbuf(__s), _M_c(traits_type::eof()) { }
 
+#if __cplusplus >= 201103L
+      istreambuf_iterator&
+      operator=(const istreambuf_iterator&) noexcept = default;
+#endif
+
       ///  Return the current character pointed to by iterator.  This returns
       ///  streambuf.sgetc().  It cannot be assigned.  NB: The result of
       ///  operator*() on an end of stream is undefined.
diff --git a/libstdc++-v3/include/std/bitset b/libstdc++-v3/include/std/bitset
index e598ea312a7..25e44d1553d 100644
--- a/libstdc++-v3/include/std/bitset
+++ b/libstdc++-v3/include/std/bitset
@@ -816,6 +816,10 @@  _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
 	  _M_bpos = _Base::_S_whichbit(__pos);
 	}
 
+#if __cplusplus >= 201103L
+	reference(const reference&) = default;
+#endif
+
 	~reference() _GLIBCXX_NOEXCEPT
 	{ }
 
diff --git a/libstdc++-v3/include/std/complex b/libstdc++-v3/include/std/complex
index 2e2c2c06560..2d1cc1831d0 100644
--- a/libstdc++-v3/include/std/complex
+++ b/libstdc++-v3/include/std/complex
@@ -1158,7 +1158,9 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       // Let the compiler synthesize the copy and assignment
       // operator.  It always does a pretty good job.
-      // complex& operator=(const complex&);
+#if __cplusplus >= 201103L
+      _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
+#endif
 
       template<typename _Tp>
         complex&
@@ -1308,7 +1310,9 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
 
       // The compiler will synthesize this, efficiently.
-      // complex& operator=(const complex&);
+#if __cplusplus >= 201103L
+      _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
+#endif
 
       template<typename _Tp>
         complex&
@@ -1460,7 +1464,9 @@  _GLIBCXX_BEGIN_NAMESPACE_VERSION
       }
 
       // The compiler knows how to do this efficiently
-      // complex& operator=(const complex&);
+#if __cplusplus >= 201103L
+      _GLIBCXX14_CONSTEXPR complex& operator=(const complex&) = default;
+#endif
 
       template<typename _Tp>
         complex&