diff options
author | Tomasz Kamiński <tkaminsk@redhat.com> | 2025-03-05 11:11:55 +0100 |
---|---|---|
committer | Tomasz Kamiński <tkaminsk@redhat.com> | 2025-03-05 12:54:53 +0100 |
commit | 95b2f8d8fb3131165b1b38645dacf10a5dd2bc15 (patch) | |
tree | f800e42421b6d3de09223d3d371d2fba6c33c3ba | |
parent | 556e25f0e9abc720c940994bd9a1491062933d49 (diff) | |
download | gcc-95b2f8d8fb3131165b1b38645dacf10a5dd2bc15.zip gcc-95b2f8d8fb3131165b1b38645dacf10a5dd2bc15.tar.gz gcc-95b2f8d8fb3131165b1b38645dacf10a5dd2bc15.tar.bz2 |
libstdc++: Fix subrange conversion to pair-like [PR119121]
Fix regression introduced by r14-8710-g65b4cba9d6a9ff
PR libstdc++/119121
libstdc++-v3/ChangeLog:
* include/bits/ranges_util.h (__detail::__pair_like_convertible_from):
Use `_Tp` in `is_reference_v` check
* testsuite/std/ranges/subrange/tuple_like.cc: New tests for
pair-like conversion
Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
-rw-r--r-- | libstdc++-v3/include/bits/ranges_util.h | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc | 29 |
2 files changed, 30 insertions, 1 deletions
diff --git a/libstdc++-v3/include/bits/ranges_util.h b/libstdc++-v3/include/bits/ranges_util.h index 2f56b72..51024ec 100644 --- a/libstdc++-v3/include/bits/ranges_util.h +++ b/libstdc++-v3/include/bits/ranges_util.h @@ -244,7 +244,7 @@ namespace ranges template<typename _Tp, typename _Up, typename _Vp> concept __pair_like_convertible_from - = !range<_Tp> && !is_reference_v<_Vp> && __pair_like<_Tp> + = !range<_Tp> && !is_reference_v<_Tp> && __pair_like<_Tp> && constructible_from<_Tp, _Up, _Vp> && __convertible_to_non_slicing<_Up, tuple_element_t<0, _Tp>> && convertible_to<_Vp, tuple_element_t<1, _Tp>>; diff --git a/libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc b/libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc index 6d05eb3..80fe618 100644 --- a/libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc +++ b/libstdc++-v3/testsuite/std/ranges/subrange/tuple_like.cc @@ -18,6 +18,8 @@ // { dg-do compile { target c++20 } } #include <ranges> +#include <tuple> +#include <utility> using S1 = std::ranges::subrange<int*>; using S2 = std::ranges::subrange<long*, void*>; @@ -49,3 +51,30 @@ static_assert( std::same_as<decltype(std::get<1>(s2)), void*> ); const S2 c2; static_assert( std::same_as<decltype(std::get<0>(c2)), long*> ); static_assert( std::same_as<decltype(std::get<1>(c2)), void*> ); + +std::pair<int*, int*> p1 = s1; +std::pair<long*, void*> p2 = s2; +std::tuple<int*, int*> t1 = s1; +std::tuple<long*, void*> t2 = s2; + +std::pair<int*, int*> const& p3 = s1; +std::tuple<int*, int*>&& t3 = s1; + +std::pair<int const*, int const*> p4 = s1; +std::tuple<int const*, void*> t4 = s1; + +static_assert( !std::convertible_to<std::ranges::subrange<int const*>, std::pair<int*, int*>> ); +static_assert( !std::convertible_to<std::ranges::subrange<int const*>, std::tuple<int*, int*>> ); + +static_assert( !std::convertible_to<std::ranges::subrange<int*>, std::pair<long*, long*>> ); +static_assert( !std::convertible_to<std::ranges::subrange<int*>, std::tuple<int, int>> ); + +struct B {}; +struct D : B {}; + +std::ranges::subrange<D*> sd; +std::pair<D*, D*> p5 = sd; +std::tuple<D const*, D const*> t5 = sd; + +static_assert( !std::convertible_to<std::ranges::subrange<D*>, std::pair<B*, B*>> ); +static_assert( !std::convertible_to<std::ranges::subrange<B*>, std::tuple<D*, D*>> ); |