https://gcc.gnu.org/g:95b2f8d8fb3131165b1b38645dacf10a5dd2bc15

commit r15-7830-g95b2f8d8fb3131165b1b38645dacf10a5dd2bc15
Author: Tomasz Kamiński <tkami...@redhat.com>
Date:   Wed Mar 5 11:11:55 2025 +0100

    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 <jwak...@redhat.com>

Diff:
---
 libstdc++-v3/include/bits/ranges_util.h            |  2 +-
 .../testsuite/std/ranges/subrange/tuple_like.cc    | 29 ++++++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

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<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 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 <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*>> );

Reply via email to