aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2022-01-12 16:58:18 +0000
committerJonathan Wakely <jwakely@redhat.com>2022-01-14 10:14:24 +0000
commitd67ba1dce9796bff177e52e2bbb68bfa2c69a884 (patch)
tree257d361f53e83031def01bf565ca139d957da1dc
parent7f390f11b445ee36cce5c5f1d5779baee817f0af (diff)
downloadgcc-d67ba1dce9796bff177e52e2bbb68bfa2c69a884.zip
gcc-d67ba1dce9796bff177e52e2bbb68bfa2c69a884.tar.gz
gcc-d67ba1dce9796bff177e52e2bbb68bfa2c69a884.tar.bz2
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.
-rw-r--r--libstdc++-v3/include/bits/stl_iterator.h8
-rw-r--r--libstdc++-v3/testsuite/24_iterators/common_iterator/1.cc16
2 files changed, 20 insertions, 4 deletions
diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h
index 24a71ea..24c106e 100644
--- a/libstdc++-v3/include/bits/stl_iterator.h
+++ b/libstdc++-v3/include/bits/stl_iterator.h
@@ -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);
}
}
diff --git a/libstdc++-v3/testsuite/24_iterators/common_iterator/1.cc b/libstdc++-v3/testsuite/24_iterators/common_iterator/1.cc
index 484d0cc..365ee89 100644
--- a/libstdc++-v3/testsuite/24_iterators/common_iterator/1.cc
+++ b/libstdc++-v3/testsuite/24_iterators/common_iterator/1.cc
@@ -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()
{