From 91ed3248ce26aaaee4d7471aa4edbc07b3f1a90e Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Fri, 6 Jun 2025 09:34:17 -0400 Subject: [PATCH] libstdc++: Fix flat_map::operator[] for const lvalue keys [PR120432] MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The const lvalue operator[] overload wasn't properly forwarding the key type to the generic overload, causing a hard error for const keys. Rather than correcting the forwarded type this patch just makes the non-template overloads call try_emplace directly instead. That way we can remove the non-standard same_as constraint on the generic overload and match the spec more closely. PR libstdc++/120432 libstdc++-v3/ChangeLog: * include/std/flat_map (flat_map::operator[]): Make the non-template overloads call try_emplace directly. Remove non-standard same_as constraint on the template overload. * testsuite/23_containers/flat_map/1.cc (test08): New test. Reviewed-by: Tomasz Kamiński Reviewed-by: Jonathan Wakely --- libstdc++-v3/include/std/flat_map | 6 +++--- libstdc++-v3/testsuite/23_containers/flat_map/1.cc | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/libstdc++-v3/include/std/flat_map b/libstdc++-v3/include/std/flat_map index 4bd4963c2ad..de006ad1c53 100644 --- a/libstdc++-v3/include/std/flat_map +++ b/libstdc++-v3/include/std/flat_map @@ -1148,14 +1148,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // element access mapped_type& operator[](const key_type& __x) - { return operator[](__x); } + { return try_emplace(__x).first->second; } mapped_type& operator[](key_type&& __x) - { return operator[](std::move(__x)); } + { return try_emplace(std::move(__x)).first->second; } template - requires same_as, _Key> || __transparent_comparator<_Compare> + requires __transparent_comparator<_Compare> mapped_type& operator[](_Key2&& __x) { return try_emplace(std::forward<_Key2>(__x)).first->second; } diff --git a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc index 1b593135f22..01278d7dc33 100644 --- a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc +++ b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc @@ -254,6 +254,15 @@ test07() VERIFY( std::ranges::equal(m, (std::pair[]){{3,4}}) ); } +void +test08() +{ + // PR libstdc++/120432 - flat_map operator[] is broken for const lvalue keys + std::flat_map m; + const int k = 42; + m[k] = 0; +} + int main() { @@ -267,4 +276,5 @@ main() test05(); test06(); test07(); + test08(); } -- 2.47.2