On Mon, 1 Dec 2025 at 21:21, Patrick Palka <[email protected]> wrote:
>
> Tested on x86_64-pc-linux-gnu, does this look OK for trunk/15?
OK for both.
>
> -- >8 --
>
> flat_map's value_type is pair<key_type, mapped_type> which we define
> correctly in the container but not in 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.
> ---
> libstdc++-v3/include/std/flat_map | 2 +-
> libstdc++-v3/testsuite/23_containers/flat_map/1.cc | 12 ++++++++++++
> .../testsuite/23_containers/flat_multimap/1.cc | 12 ++++++++++++
> 3 files changed, 25 insertions(+), 1 deletion(-)
>
> diff --git a/libstdc++-v3/include/std/flat_map
> b/libstdc++-v3/include/std/flat_map
> index de006ad1c533..e48c3eae07fd 100644
> --- a/libstdc++-v3/include/std/flat_map
> +++ b/libstdc++-v3/include/std/flat_map
> @@ -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;
> diff --git a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
> b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
> index 01278d7dc33c..5bcda3464f1f 100644
> --- a/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
> +++ b/libstdc++-v3/testsuite/23_containers/flat_map/1.cc
> @@ -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();
> }
> diff --git a/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
> b/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
> index d746614401de..f143f3acd1b5 100644
> --- a/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
> +++ b/libstdc++-v3/testsuite/23_containers/flat_multimap/1.cc
> @@ -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();
> }
> --
> 2.52.0.154.gf0ef5b6d9b
>