@@ -1925,9 +1925,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
}
+ common_iterator(const common_iterator&) = default;
+
constexpr
common_iterator(const common_iterator& __x)
noexcept(_S_noexcept<const _It&, const _Sent&>())
+ requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
: _M_valueless(), _M_index(__x._M_index)
{
if (_M_index == 0)
@@ -1946,9 +1949,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
}
+ common_iterator(common_iterator&&) = default;
+
constexpr
common_iterator(common_iterator&& __x)
noexcept(_S_noexcept<_It, _Sent>())
+ requires (!is_trivially_copyable_v<_It> || !is_trivially_copyable_v<_Sent>)
: _M_valueless(), _M_index(__x._M_index)
{
if (_M_index == 0)
@@ -2017,8 +2023,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return *this;
}
+#if __cpp_concepts >= 202002L // Constrained special member functions
+ ~common_iterator() = default;
+
constexpr
~common_iterator()
+ requires (!is_trivially_destructible_v<_It>
+ || !is_trivially_destructible_v<_Sent>)
+#else
+ constexpr
+ ~common_iterator()
+#endif
{
if (_M_index == 0)
_M_it.~_It();
@@ -4,6 +4,21 @@
#include <testsuite_iterators.h>
#include <testsuite_hooks.h>
+void
+test_triviality()
+{
+ using I = std::common_iterator<int*, const int*>;
+
+ // Cannot be trivial, because it has to initialize members.
+ static_assert( ! std::is_trivially_default_constructible_v<I> );
+
+ static_assert( std::is_trivially_destructible_v<I> );
+ static_assert( std::is_trivially_copy_constructible_v<I> );
+ static_assert( std::is_trivially_copy_assignable_v<I> );
+ static_assert( std::is_trivially_move_constructible_v<I> );
+ static_assert( std::is_trivially_move_assignable_v<I> );
+}
+
void
test_valueless_assignment()
{