On 24/02/20 18:39 -0500, Patrick Palka wrote:
On Mon, 24 Feb 2020, Patrick Palka wrote:

libstdc++-v3/ChangeLog:

        LWG 3301 transform_view::_Iterator has incorrect iterator_category
        * include/std/ranges (transform_view::_Iterator::_S_iter_cat): Adjust
        determination of iterator_category as per LWG 3301.
        * testsuite/std/ranges/adaptors/transform.cc: Augment test.
---
 libstdc++-v3/include/std/ranges               | 16 +++++++++----
 .../std/ranges/adaptors/transform.cc          | 24 +++++++++++++++++++
 2 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index ab8fbaca38f..aed90e9710e 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -1570,12 +1570,18 @@ namespace views
          static constexpr auto
          _S_iter_cat()
          {
-           using _Cat
-              = typename iterator_traits<_Base_iter>::iterator_category;
-           if constexpr (derived_from<_Cat, contiguous_iterator_tag>)
-             return random_access_iterator_tag{};
+           using _Res = invoke_result_t<_Fp&, range_reference_t<_Base>>;

Consider this line fixed to use 'typename'.

+           if constexpr (is_lvalue_reference_v<_Res>)
+             {
+               using _Cat
+                 = typename iterator_traits<_Base_iter>::iterator_category;
+               if constexpr (derived_from<_Cat, contiguous_iterator_tag>)
+                 return random_access_iterator_tag{};
+               else
+                 return _Cat{};
+             }
            else
-             return _Cat{};
+             return input_iterator_tag{};
          }

          static constexpr decltype(auto)
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc 
b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc
index ad51fffb43d..0845febe2cf 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/transform.cc
@@ -77,10 +77,34 @@ test03()
   VERIFY( ranges::equal(v, (int[]){1,2,3,4,5}) );
 }

+void
+test04()
+{
+  // LWG 3302

Consider this comment fixed to say 3301.

OK, thanks.


Reply via email to