https://gcc.gnu.org/g:c9cc091338b13835afbb0f5d68bfde80da172fd2

commit r15-11191-gc9cc091338b13835afbb0f5d68bfde80da172fd2
Author: Patrick Palka <[email protected]>
Date:   Tue May 19 13:43:10 2026 -0400

    libstdc++: Fix incorrect move in flat_map::_M_try_emplace [PR125374]
    
            PR libstdc++/125374
    
    libstdc++-v3/ChangeLog:
    
            * include/std/flat_map (_Flat_map_impl::_M_try_emplace): Forward
            instead of unconditionally moving __k when inserting it.
            * testsuite/23_containers/flat_map/1.cc (test10): New test.
    
    Reviewed-by: Jonathan Wakely <[email protected]>
    (cherry picked from commit 6d114645fa1c9831a109c8a8934685f49364818a)

Diff:
---
 libstdc++-v3/include/std/flat_map                  |  2 +-
 libstdc++-v3/testsuite/23_containers/flat_map/1.cc | 16 ++++++++++++++++
 2 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/std/flat_map 
b/libstdc++-v3/include/std/flat_map
index e48c3eae07fd..9956738ea630 100644
--- a/libstdc++-v3/include/std/flat_map
+++ b/libstdc++-v3/include/std/flat_map
@@ -482,7 +482,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
              return {iterator{this, __key_it}, false};
 
          auto __guard = _M_make_clear_guard();
-         __key_it = _M_cont.keys.insert(__key_it, std::move(__k));
+         __key_it = _M_cont.keys.insert(__key_it, std::forward<_Key2>(__k));
          __value_it = _M_cont.values.begin() + (__key_it - 
_M_cont.keys.begin());
          _M_cont.values.emplace(__value_it, std::forward<_Args>(__args)...);
          __guard._M_disable();
diff --git a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc 
b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
index 2f4ffa2d1bd4..f762a64797fb 100644
--- a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
+++ b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
@@ -12,6 +12,7 @@
 #include <testsuite_allocator.h>
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
+#include <string>
 #include <tuple>
 
 struct Gt {
@@ -272,6 +273,20 @@ test09()
   using value_type = std::pair<int, int>;
 }
 
+void
+test10()
+{
+  // PR libstdc++/125374 - flat_map unconditionally moves from lvalue keys in
+  // _M_try_emplace
+  std::flat_map<std::string, int, std::less<>> m;
+  std::string k = "hello";
+  m[k] = 1;
+  VERIFY (k == "hello");
+  k = "world";
+  m.try_emplace(k, 2);
+  VERIFY (k == "world");
+}
+
 int
 main()
 {
@@ -287,4 +302,5 @@ main()
   test07();
   test08();
   test09();
+  test10();
 }

Reply via email to