diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2017-05-15 14:47:40 +0100 |
---|---|---|
committer | Jonathan Wakely <redi@gcc.gnu.org> | 2017-05-15 14:47:40 +0100 |
commit | 85c05b5eec703f9dd26e05215f336a3518b475df (patch) | |
tree | b9923cca1788e3adff2b0691135820d154b9c635 | |
parent | 511604823d33a79a88eaa12e881badd2170a0614 (diff) | |
download | gcc-85c05b5eec703f9dd26e05215f336a3518b475df.zip gcc-85c05b5eec703f9dd26e05215f336a3518b475df.tar.gz gcc-85c05b5eec703f9dd26e05215f336a3518b475df.tar.bz2 |
Fix order and types of members in C++17 insert_return_type structs
PR libstdc++/80761
* include/bits/node_handle.h (_Node_insert_return): Reorder members.
(tuple_size, tuple_element): Remove partial specializations.
* include/bits/stl_tree.h (_Rb_tree::insert_return_type): Use
const_iterator for std::set.
* testsuite/23_containers/map/modifiers/extract.cc: New.
* testsuite/23_containers/set/modifiers/extract.cc: New.
* testsuite/23_containers/unordered_map/modifiers/extract.cc: New.
* testsuite/23_containers/unordered_set/modifiers/extract.cc: New.
From-SVN: r248062
7 files changed, 60 insertions, 18 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 8664e8c..4c6ca4b 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,15 @@ +2017-05-15 Jonathan Wakely <jwakely@redhat.com> + + PR libstdc++/80761 + * include/bits/node_handle.h (_Node_insert_return): Reorder members. + (tuple_size, tuple_element): Remove partial specializations. + * include/bits/stl_tree.h (_Rb_tree::insert_return_type): Use + const_iterator for std::set. + * testsuite/23_containers/map/modifiers/extract.cc: New. + * testsuite/23_containers/set/modifiers/extract.cc: New. + * testsuite/23_containers/unordered_map/modifiers/extract.cc: New. + * testsuite/23_containers/unordered_set/modifiers/extract.cc: New. + 2017-05-12 Jonathan Wakely <jwakely@redhat.com> PR libstdc++/78939 diff --git a/libstdc++-v3/include/bits/node_handle.h b/libstdc++-v3/include/bits/node_handle.h index 44a9264..c7694a1 100644 --- a/libstdc++-v3/include/bits/node_handle.h +++ b/libstdc++-v3/include/bits/node_handle.h @@ -280,8 +280,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Iterator, typename _NodeHandle> struct _Node_insert_return { - bool inserted = false; _Iterator position = _Iterator(); + bool inserted = false; _NodeHandle node; template<size_t _Idx> @@ -305,22 +305,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } }; - template<typename _Iterator, typename _NodeHandle> - struct tuple_size<_Node_insert_return<_Iterator, _NodeHandle>> - : integral_constant<size_t, 3> { }; - - template<typename _Iterator, typename _NodeHandle> - struct tuple_element<0, _Node_insert_return<_Iterator, _NodeHandle>> - { using type = bool; }; - - template<typename _Iterator, typename _NodeHandle> - struct tuple_element<1, _Node_insert_return<_Iterator, _NodeHandle>> - { using type = _Iterator; }; - - template<typename _Iterator, typename _NodeHandle> - struct tuple_element<2, _Node_insert_return<_Iterator, _NodeHandle>> - { using type = _NodeHandle; }; - _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/bits/stl_tree.h b/libstdc++-v3/include/bits/stl_tree.h index aedee06..3f133b0 100644 --- a/libstdc++-v3/include/bits/stl_tree.h +++ b/libstdc++-v3/include/bits/stl_tree.h @@ -812,7 +812,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cplusplus > 201402L using node_type = _Node_handle<_Key, _Val, _Node_allocator>; - using insert_return_type = _Node_insert_return<iterator, node_type>; + using insert_return_type = _Node_insert_return< + conditional_t<is_same_v<_Key, _Val>, const_iterator, iterator>, + node_type>; #endif pair<_Base_ptr, _Base_ptr> diff --git a/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc index 507a708..80eaf01 100644 --- a/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/map/modifiers/extract.cc @@ -135,6 +135,17 @@ test03() static_assert( is_same_v<test_type::node_type, compat_type3::node_type> ); } +void +test04() +{ + // Check order of members in insert_return_type + auto [pos, ins, node] = test_type::insert_return_type{}; + using std::is_same_v; + static_assert( is_same_v<test_type::iterator, decltype(pos)> ); + static_assert( is_same_v<bool, decltype(ins)> ); + static_assert( is_same_v<test_type::node_type, decltype(node)> ); +} + int main() { diff --git a/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc index c56767a..3fbc6b9 100644 --- a/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/set/modifiers/extract.cc @@ -126,6 +126,17 @@ test03() static_assert( is_same_v<test_type::node_type, compat_type3::node_type> ); } +void +test04() +{ + // Check order of members in insert_return_type + auto [pos, ins, node] = test_type::insert_return_type{}; + using std::is_same_v; + static_assert( is_same_v<test_type::iterator, decltype(pos)> ); + static_assert( is_same_v<bool, decltype(ins)> ); + static_assert( is_same_v<test_type::node_type, decltype(node)> ); +} + int main() { diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc index ad87c70..ce50766 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_map/modifiers/extract.cc @@ -136,6 +136,17 @@ test03() static_assert( is_same_v<test_type::node_type, compat_type3::node_type> ); } +void +test04() +{ + // Check order of members in insert_return_type + auto [pos, ins, node] = test_type::insert_return_type{}; + using std::is_same_v; + static_assert( is_same_v<test_type::iterator, decltype(pos)> ); + static_assert( is_same_v<bool, decltype(ins)> ); + static_assert( is_same_v<test_type::node_type, decltype(node)> ); +} + int main() { diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc index 6f77a94..5be8195 100644 --- a/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/modifiers/extract.cc @@ -128,6 +128,17 @@ test03() static_assert( is_same_v<test_type::node_type, compat_type3::node_type> ); } +void +test04() +{ + // Check order of members in insert_return_type + auto [pos, ins, node] = test_type::insert_return_type{}; + using std::is_same_v; + static_assert( is_same_v<test_type::iterator, decltype(pos)> ); + static_assert( is_same_v<bool, decltype(ins)> ); + static_assert( is_same_v<test_type::node_type, decltype(node)> ); +} + int main() { |