re PR libstdc++/82522 (std::map::insert(value_type &&) not selected)
authorFrançois Dumont <fdumont@gcc.gnu.org>
Wed, 20 Dec 2017 21:53:25 +0000 (21:53 +0000)
committerFrançois Dumont <fdumont@gcc.gnu.org>
Wed, 20 Dec 2017 21:53:25 +0000 (21:53 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/map.h
libstdc++-v3/include/debug/multimap.h
libstdc++-v3/include/debug/unordered_map
libstdc++-v3/testsuite/23_containers/map/modifiers/insert/dr2354.cc
libstdc++-v3/testsuite/23_containers/multimap/modifiers/insert/dr2354.cc
libstdc++-v3/testsuite/23_containers/unordered_map/insert/dr2354.cc
libstdc++-v3/testsuite/23_containers/unordered_multimap/insert/dr2354.cc

index abfd056..f06edc1 100644 (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
index f769b50..64f2bf8 100644 (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>
index 6c7b2ab..cdbada8 100644 (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>
index 0ed9922..6757339 100644 (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>
index 338d9fd..cc0fcbb 100644 (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
+}
index ca743ec..73cbf4c 100644 (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
+}
index fe53565..3507efa 100644 (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
+}
index 5a27242..ff66113 100644 (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
+}