libstdc++: Use std::construct_at in std::common_iterator [PR103992]

This should have been done as part of the LWG 3574 changes.

libstdc++-v3/ChangeLog:

	PR libstdc++/103992
	* include/bits/stl_iterator.h (common_iterator): Use
	std::construct_at instead of placement new.
	* testsuite/24_iterators/common_iterator/1.cc: Check copy
	construction is usable in constant expressions.
This commit is contained in:
Jonathan Wakely 2022-01-12 16:58:18 +00:00
parent 7f390f11b4
commit d67ba1dce9
2 changed files with 20 additions and 4 deletions

View File

@ -1907,14 +1907,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
if constexpr (is_trivially_default_constructible_v<_It>)
_M_it = std::move(__x._M_it);
else
::new((void*)std::__addressof(_M_it)) _It(__x._M_it);
std::construct_at(std::__addressof(_M_it), __x._M_it);
}
else if (_M_index == 1)
{
if constexpr (is_trivially_default_constructible_v<_Sent>)
_M_sent = std::move(__x._M_sent);
else
::new((void*)std::__addressof(_M_sent)) _Sent(__x._M_sent);
std::construct_at(std::__addressof(_M_sent), __x._M_sent);
}
}
@ -1928,14 +1928,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
if constexpr (is_trivially_default_constructible_v<_It>)
_M_it = std::move(__x._M_it);
else
::new((void*)std::__addressof(_M_it)) _It(__x._M_it);
std::construct_at(std::__addressof(_M_it), __x._M_it);
}
else if (_M_index == 1)
{
if constexpr (is_trivially_default_constructible_v<_Sent>)
_M_sent = std::move(__x._M_sent);
else
::new((void*)std::__addressof(_M_sent)) _Sent(__x._M_sent);
std::construct_at(std::__addressof(_M_sent), __x._M_sent);
}
}

View File

@ -157,6 +157,22 @@ test04()
VERIFY( x.i == 2 );
}
constexpr bool
test_pr103992()
{
using C1 = std::common_iterator<std::reverse_iterator<int*>,
std::unreachable_sentinel_t>;
using C2 = std::common_iterator<std::reverse_iterator<const int*>,
std::unreachable_sentinel_t>;
C1 c1;
C2 c2 = c1;
C1 c3 = c1;
return true;
}
static_assert( test_pr103992() );
int
main()
{