libstdc++: Inconsistent const in flat_map's value_type [PR122921]

flat_map's value_type is pair<key_type, mapped_type>, which we correctly
define within the container but incorrectly within the iterator.

	PR libstdc++/122921

libstdc++-v3/ChangeLog:

	* include/std/flat_map (_Flat_map_impl::_Iterator::value_type):
	Remove const from key_type to make consistent with the
	container's value_type.
	* testsuite/23_containers/flat_map/1.cc (test09): New test.
	* testsuite/23_containers/flat_multimap/1.cc (test09): New test.

Reported-by: Vincent X
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
This commit is contained in:
Patrick Palka
2025-12-01 17:08:01 -05:00
parent d9a64bf6a6
commit 3e02f86cd1
3 changed files with 25 additions and 1 deletions

View File

@@ -953,7 +953,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
public:
using iterator_category = input_iterator_tag;
using iterator_concept = random_access_iterator_tag;
using value_type = pair<const key_type, mapped_type>;
using value_type = pair<key_type, mapped_type>;
using reference = pair<const key_type&,
ranges::__maybe_const_t<_Const, mapped_type>&>;
using difference_type = ptrdiff_t;

View File

@@ -263,6 +263,17 @@ test08()
m[k] = 0;
}
void
test09()
{
// PR libstdc++/122921 - The value_type of flat_map's iterator should be
// pair<Key, T> instead of pair<const Key, T>
using type = std::flat_map<int, int>;
using value_type = std::ranges::range_value_t<type>;
using value_type = type::value_type;
using value_type = std::pair<int, int>;
}
int
main()
{
@@ -277,4 +288,5 @@ main()
test06();
test07();
test08();
test09();
}

View File

@@ -232,6 +232,17 @@ test07()
VERIFY( std::ranges::equal(m, (std::pair<int,int>[]){{3,4},{3,3}}) );
}
void
test09()
{
// PR libstdc++/122921 - The value_type of flat_map's iterator should be
// pair<Key, T> instead of pair<const Key, T>
using type = std::flat_multimap<int, int>;
using value_type = std::ranges::range_value_t<type>;
using value_type = type::value_type;
using value_type = std::pair<int, int>;
}
int
main()
{
@@ -245,4 +256,5 @@ main()
test05();
test06();
test07();
test09();
}