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.