libstdc++: Implement LWG 3535 changes to ranges::join_view
authorPatrick Palka <ppalka@redhat.com>
Thu, 21 Oct 2021 01:34:21 +0000 (21:34 -0400)
committerPatrick Palka <ppalka@redhat.com>
Thu, 21 Oct 2021 01:34:21 +0000 (21:34 -0400)
libstdc++-v3/ChangeLog:

* include/std/ranges (join_view::__iter_cat::_S_iter_cat): Adjust
criteria for returning bidirectional_iterator_tag as per LWG 3535.
(join_view::_Iterator::_S_iter_concept): Likewise.

libstdc++-v3/include/std/ranges

index 273699a..c1519c7 100644 (file)
@@ -2523,7 +2523,8 @@ namespace views::__adaptor
            using _OuterCat = typename iterator_traits<_Outer_iter>::iterator_category;
            using _InnerCat = typename iterator_traits<_Inner_iter>::iterator_category;
            if constexpr (derived_from<_OuterCat, bidirectional_iterator_tag>
-                         && derived_from<_InnerCat, bidirectional_iterator_tag>)
+                         && derived_from<_InnerCat, bidirectional_iterator_tag>
+                         && common_range<range_reference_t<_Base<_Const>>>)
              return bidirectional_iterator_tag{};
            else if constexpr (derived_from<_OuterCat, forward_iterator_tag>
                               && derived_from<_InnerCat, forward_iterator_tag>)
@@ -2575,7 +2576,8 @@ namespace views::__adaptor
          {
            if constexpr (_S_ref_is_glvalue
                          && bidirectional_range<_Base>
-                         && bidirectional_range<range_reference_t<_Base>>)
+                         && bidirectional_range<range_reference_t<_Base>>
+                         && common_range<range_reference_t<_Base>>)
              return bidirectional_iterator_tag{};
            else if constexpr (_S_ref_is_glvalue
                               && forward_range<_Base>