Tested on x86_64-pc-linux-gnu, does this look OK for trunk/15? The 'volatile' issue from that PR Will be fixed in a separate patch as operator[] isn't the only operation that's affected.
-- >8 -- The const lvalue operator[] overload wasn't properly forwarding the key type to the generic overload. PR libstdc++/120432 libstdc++-v3/ChangeLog: * include/std/flat_map (_Flat_map_base::operator[]): Correct forwarding from the const lvalue key overload. * testsuite/23_containers/flat_map/1.cc (test08): New test. * testsuite/23_containers/flat_multimap/1.cc (test08): New test. --- libstdc++-v3/include/std/flat_map | 2 +- libstdc++-v3/testsuite/23_containers/flat_map/1.cc | 10 ++++++++++ .../testsuite/23_containers/flat_multimap/1.cc | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/std/flat_map b/libstdc++-v3/include/std/flat_map index 6593988d213c..4d9ced1e8191 100644 --- a/libstdc++-v3/include/std/flat_map +++ b/libstdc++-v3/include/std/flat_map @@ -1142,7 +1142,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // element access mapped_type& operator[](const key_type& __x) - { return operator[]<const key_type>(__x); } + { return operator[]<const key_type&>(__x); } mapped_type& operator[](key_type&& __x) diff --git a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc index a9690208b09f..2af516410279 100644 --- a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc +++ b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc @@ -253,6 +253,15 @@ test07() VERIFY( std::ranges::equal(m, (std::pair<int,int>[]){{3,4}}) ); } +void +test08() +{ + // PR libstdc++/120432 - flat_map operator[] is broken for const lvalue keys + std::flat_map<int, int> m; + const int k = 42; + m[k] = 0; +} + int main() { @@ -266,4 +275,5 @@ main() test05(); test06(); test07(); + test08(); } diff --git a/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc b/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc index 1c5c9a88ab6b..638b269011d4 100644 --- a/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc +++ b/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc @@ -231,6 +231,15 @@ test07() VERIFY( std::ranges::equal(m, (std::pair<int,int>[]){{3,4},{3,3}}) ); } +void +test08() +{ + // PR libstdc++/120432 - flat_map operator[] is broken for const lvalue keys + std::flat_multimap<int, int> m; + const int k = 42; + m[k] = 0; +} + int main() { @@ -244,4 +253,5 @@ main() test05(); test06(); test07(); + test08(); } -- 2.49.0.654.g845c48a16a