libstdc++: Fix flat_map::operator[] for const lvalue keys [PR120432]

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 <tkaminsk@redhat.com>
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
This commit is contained in:
Patrick Palka
2025-06-06 09:34:17 -04:00
parent 08a0b6dabd
commit 91ed3248ce
2 changed files with 13 additions and 3 deletions

View File

@@ -1148,14 +1148,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// element access
mapped_type&
operator[](const key_type& __x)
{ return operator[]<const key_type>(__x); }
{ return try_emplace(__x).first->second; }
mapped_type&
operator[](key_type&& __x)
{ return operator[]<key_type>(std::move(__x)); }
{ return try_emplace(std::move(__x)).first->second; }
template<typename _Key2>
requires same_as<remove_cvref_t<_Key2>, _Key> || __transparent_comparator<_Compare>
requires __transparent_comparator<_Compare>
mapped_type&
operator[](_Key2&& __x)
{ return try_emplace(std::forward<_Key2>(__x)).first->second; }

View File

@@ -254,6 +254,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()
{
@@ -267,4 +276,5 @@ main()
test05();
test06();
test07();
test08();
}