libstdc++: Include std::ranges::subrange definition in <tuple> [PR102301]
authorJonathan Wakely <jwakely@redhat.com>
Mon, 23 Jan 2023 12:25:36 +0000 (12:25 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Tue, 24 Jan 2023 23:46:42 +0000 (23:46 +0000)
commit33ed11085837e9492c6ed512931f5b6375c68ee7
tree932b6d07d732b53668256cffd03f12457db7bdf2
parentaba6416e95ab4138a0ecab0fd51e7e9329d74a45
libstdc++: Include std::ranges::subrange definition in <tuple> [PR102301]

In order for std::make_from_tuple to work with tuple-like types, the
overloads of std::get for those types must have been declared before the
definition of std::make_from_tuple. That means we need to include the
definition of std::ranges::subrange in <tuple>.

The definitions of std::pair and its overloads of std::get are already
included in <tuple>. We provide forward declarations of std::array and
its std::get overloads in <tuple>. We could just declare subrange
without defining it, and give ranges::get a non-deduced return type,
like so:

  namespace ranges
  {
    enum class subrange_kind : bool { unsized, sized};

    template<input_or_output_iterator I, sentinel_for<I> S,
     subrange_kind K>
      requires (K == subrange_kind::sized || !sized_sentinel_for<S, I>)
      class subrange;

    template<size_t _Num, class _It, class _Sent, subrange_kind _Kind>
      requires (_Num < 2)
      constexpr __conditional_t<_Num == 0, _It, _Sent>
      get(const subrange<_It, _Sent, _Kind>& __r);

    template<size_t _Num, class _It, class _Sent, subrange_kind _Kind>
      requires (_Num < 2)
      constexpr __conditional_t<_Num == 0, _It, _Sent>
      get(subrange<_It, _Sent, _Kind>&& __r)
  }
  using ranges::get;

It is a bit late in the GCC 13 dev cycle to do this, so just include the
right headers for now.

Also add the dangling check to std::make_from_tuple added by P2255.

libstdc++-v3/ChangeLog:

PR libstdc++/102301
* include/bits/ranges_base.h: Include <bits/stl_iterator.h> for
std::make_reverse_iterator.
* include/std/tuple: Include <bits/ranges_util.h> for subrange.
(make_from_tuple): Add static assertion from P2255 to diagnose
dangling references.
* testsuite/20_util/tuple/make_from_tuple/dangling_ref.cc: New test.
* testsuite/20_util/tuple/make_from_tuple/tuple_like.cc: New test.
libstdc++-v3/include/bits/ranges_base.h
libstdc++-v3/include/std/tuple
libstdc++-v3/testsuite/20_util/tuple/make_from_tuple/dangling_ref.cc [new file with mode: 0644]
libstdc++-v3/testsuite/20_util/tuple/make_from_tuple/tuple_like.cc [new file with mode: 0644]