mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
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:
@@ -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; }
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user