From: Tomasz KamiƄski Date: Wed, 5 Mar 2025 10:11:55 +0000 (+0100) Subject: libstdc++: Fix subrange conversion to pair-like [PR119121] X-Git-Tag: basepoints/gcc-16~1723 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=95b2f8d8fb3131165b1b38645dacf10a5dd2bc15;p=thirdparty%2Fgcc.git 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 --- diff --git a/libstdc++-v3/include/bits/ranges_util.h b/libstdc++-v3/include/bits/ranges_util.h index 2f56b727e55a..51024ecbebe5 100644 --- a/libstdc++-v3/include/bits/ranges_util.h +++ b/libstdc++-v3/include/bits/ranges_util.h @@ -244,7 +244,7 @@ namespace ranges template 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 6d05eb3ef7d5..80fe618642a0 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 +#include +#include using S1 = std::ranges::subrange; using S2 = std::ranges::subrange; @@ -49,3 +51,30 @@ static_assert( std::same_as(s2)), void*> ); const S2 c2; static_assert( std::same_as(c2)), long*> ); static_assert( std::same_as(c2)), void*> ); + +std::pair p1 = s1; +std::pair p2 = s2; +std::tuple t1 = s1; +std::tuple t2 = s2; + +std::pair const& p3 = s1; +std::tuple&& t3 = s1; + +std::pair p4 = s1; +std::tuple t4 = s1; + +static_assert( !std::convertible_to, std::pair> ); +static_assert( !std::convertible_to, std::tuple> ); + +static_assert( !std::convertible_to, std::pair> ); +static_assert( !std::convertible_to, std::tuple> ); + +struct B {}; +struct D : B {}; + +std::ranges::subrange sd; +std::pair p5 = sd; +std::tuple t5 = sd; + +static_assert( !std::convertible_to, std::pair> ); +static_assert( !std::convertible_to, std::tuple> );