re PR libstdc++/82522 (std::map::insert(value_type &&) not selected)

2017-12-20  François Dumont  <fdumont@gcc.gnu.org>

	PR libstdc++/82522
	* include/debug/map.h (map::insert(value_type&&))
	(map::insert(const_iterator, value_type&&)): Add overload for rvalues.
	* include/debug/multimap.h (multimap::insert(value_type&&))
	(multimap::insert(const_iterator, value_type&&)): Likewise.
	* include/debug/unordered_map (unordered_map::insert(value_type&&))
	(unordered_map::insert(const_iterator, value_type&&))
	(unordered_multimap::insert(value_type&&))
	(unordered_multimap::insert(const_iterator, value_type&&)): Likewise.
	* testsuite/23_containers/map/modifiers/insert/dr2354.cc (test02): New.
	* testsuite/23_containers/multimap/modifiers/insert/dr2354.cc (test02):
	New.
	* testsuite/23_containers/unordered_map/insert/dr2354.cc (test02): New.
	* testsuite/23_containers/unordered_multimap/insert/dr2354.cc (test02):
	New.

From-SVN: r255904
This commit is contained in:
François Dumont 2017-12-20 21:53:25 +00:00
parent 7dd342222b
commit 1679da1571
8 changed files with 132 additions and 7 deletions

View File

@ -1,3 +1,21 @@
2017-12-20 François Dumont <fdumont@gcc.gnu.org>
PR libstdc++/82522
* include/debug/map.h (map::insert(value_type&&))
(map::insert(const_iterator, value_type&&)): Add overload for rvalues.
* include/debug/multimap.h (multimap::insert(value_type&&))
(multimap::insert(const_iterator, value_type&&)): Likewise.
* include/debug/unordered_map (unordered_map::insert(value_type&&))
(unordered_map::insert(const_iterator, value_type&&))
(unordered_multimap::insert(value_type&&))
(unordered_multimap::insert(const_iterator, value_type&&)): Likewise.
* testsuite/23_containers/map/modifiers/insert/dr2354.cc (test02): New.
* testsuite/23_containers/multimap/modifiers/insert/dr2354.cc (test02):
New.
* testsuite/23_containers/unordered_map/insert/dr2354.cc (test02): New.
* testsuite/23_containers/unordered_multimap/insert/dr2354.cc (test02):
New.
2017-12-20 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/cpu/aarch64/opt/ext/opt_random.h (__VEXT): Check

View File

@ -260,6 +260,15 @@ namespace __debug
}
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
std::pair<iterator, bool>
insert(value_type&& __x)
{
auto __res = _Base::insert(std::move(__x));
return { iterator(__res.first, this), __res.second };
}
template<typename _Pair, typename = typename
std::enable_if<std::is_constructible<value_type,
_Pair&&>::value>::type>
@ -291,6 +300,15 @@ namespace __debug
}
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
iterator
insert(const_iterator __position, value_type&& __x)
{
__glibcxx_check_insert(__position);
return { _Base::insert(__position.base(), std::move(__x)), this };
}
template<typename _Pair, typename = typename
std::enable_if<std::is_constructible<value_type,
_Pair&&>::value>::type>

View File

@ -244,6 +244,12 @@ namespace __debug
{ return iterator(_Base::insert(__x), this); }
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
iterator
insert(value_type&& __x)
{ return { _Base::insert(std::move(__x)), this }; }
template<typename _Pair, typename = typename
std::enable_if<std::is_constructible<value_type,
_Pair&&>::value>::type>
@ -270,6 +276,15 @@ namespace __debug
}
#if __cplusplus >= 201103L
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
iterator
insert(const_iterator __position, value_type&& __x)
{
__glibcxx_check_insert(__position);
return { _Base::insert(__position.base(), std::move(__x)), this };
}
template<typename _Pair, typename = typename
std::enable_if<std::is_constructible<value_type,
_Pair&&>::value>::type>

View File

@ -312,19 +312,20 @@ namespace __debug
insert(const value_type& __obj)
{
size_type __bucket_count = this->bucket_count();
std::pair<_Base_iterator, bool> __res = _Base::insert(__obj);
auto __res = _Base::insert(__obj);
_M_check_rehashed(__bucket_count);
return std::make_pair(iterator(__res.first, this), __res.second);
return { iterator(__res.first, this), __res.second };
}
iterator
insert(const_iterator __hint, const value_type& __obj)
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
std::pair<iterator, bool>
insert(value_type&& __x)
{
__glibcxx_check_insert(__hint);
size_type __bucket_count = this->bucket_count();
_Base_iterator __it = _Base::insert(__hint.base(), __obj);
auto __res = _Base::insert(std::move(__x));
_M_check_rehashed(__bucket_count);
return iterator(__it, this);
return { iterator(__res.first, this), __res.second };
}
template<typename _Pair, typename = typename
@ -340,6 +341,28 @@ namespace __debug
return std::make_pair(iterator(__res.first, this), __res.second);
}
iterator
insert(const_iterator __hint, const value_type& __obj)
{
__glibcxx_check_insert(__hint);
size_type __bucket_count = this->bucket_count();
_Base_iterator __it = _Base::insert(__hint.base(), __obj);
_M_check_rehashed(__bucket_count);
return iterator(__it, this);
}
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
iterator
insert(const_iterator __hint, value_type&& __x)
{
__glibcxx_check_insert(__hint);
size_type __bucket_count = this->bucket_count();
auto __it = _Base::insert(__hint.base(), std::move(__x));
_M_check_rehashed(__bucket_count);
return iterator(__it, this);
}
template<typename _Pair, typename = typename
std::enable_if<std::is_constructible<value_type,
_Pair&&>::value>::type>
@ -977,6 +1000,17 @@ namespace __debug
return iterator(__it, this);
}
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
iterator
insert(value_type&& __x)
{
size_type __bucket_count = this->bucket_count();
auto __it = _Base::insert(std::move(__x));
_M_check_rehashed(__bucket_count);
return { __it, this };
}
iterator
insert(const_iterator __hint, const value_type& __obj)
{
@ -987,6 +1021,18 @@ namespace __debug
return iterator(__it, this);
}
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2354. Unnecessary copying when inserting into maps with braced-init
iterator
insert(const_iterator __hint, value_type&& __x)
{
__glibcxx_check_insert(__hint);
size_type __bucket_count = this->bucket_count();
auto __it = _Base::insert(__hint.base(), std::move(__x));
_M_check_rehashed(__bucket_count);
return iterator(__it, this);
}
template<typename _Pair, typename = typename
std::enable_if<std::is_constructible<value_type,
_Pair&&>::value>::type>

View File

@ -30,3 +30,10 @@ test01()
std::map<int, MoveOnly> m;
m.insert({1, 2}); // PR libstdc++/82522 - LWG 2354
}
void
test02()
{
std::map<int, MoveOnly> m;
m.insert(m.begin(), {1, 2}); // PR libstdc++/82522 - LWG 2354
}

View File

@ -30,3 +30,10 @@ test01()
std::multimap<int, MoveOnly> m;
m.insert({1, 2}); // PR libstdc++/82522 - LWG 2354
}
void
test02()
{
std::multimap<int, MoveOnly> m;
m.insert(m.begin(), {1, 2}); // PR libstdc++/82522 - LWG 2354
}

View File

@ -30,3 +30,10 @@ test01()
std::unordered_map<int, MoveOnly> m;
m.insert({1, 2}); // PR libstdc++/82522 - LWG 2354
}
void
test02()
{
std::unordered_map<int, MoveOnly> m;
m.insert(m.begin(), {1, 2}); // PR libstdc++/82522 - LWG 2354
}

View File

@ -30,3 +30,10 @@ test01()
std::unordered_multimap<int, MoveOnly> m;
m.insert({1, 2}); // PR libstdc++/82522 - LWG 2354
}
void
test02()
{
std::unordered_multimap<int, MoveOnly> m;
m.insert(m.begin(), {1, 2}); // PR libstdc++/82522 - LWG 2354
}