libstdc++: Fix use of inaccessible private member in split_view (PR93936)
authorPatrick Palka <ppalka@redhat.com>
Wed, 26 Feb 2020 13:38:06 +0000 (08:38 -0500)
committerPatrick Palka <ppalka@redhat.com>
Wed, 26 Feb 2020 15:24:00 +0000 (10:24 -0500)
We are calling _OuterIter::__current from _InnerIter::operator==, but the former
is private within this non-member friend.  Fix this by calling
_OuterIter::operator== instead, which does the right thing here.

libstdc++-v3/ChangeLog:

PR libstdc++/93936
* include/std/ranges (split_view::_InnerIter::operator==): Compare
the operands' _M_i rather than their _M_i.current().
* testsuite/std/ranges/adaptors/split.cc: Augment test.

libstdc++-v3/ChangeLog
libstdc++-v3/include/std/ranges
libstdc++-v3/testsuite/std/ranges/adaptors/split.cc

index 8af27d4..49f2b59 100644 (file)
@@ -1,5 +1,10 @@
 2020-02-26  Patrick Palka  <ppalka@redhat.com>
 
+       PR libstdc++/93936
+       * include/std/ranges (split_view::_InnerIter::operator==): Compare
+       the operands' _M_i rather than their _M_i.current().
+       * testsuite/std/ranges/adaptors/split.cc: Augment test.
+
        P1645R1 constexpr for <numeric> algorithms
        * include/bits/stl_numeric.h (iota, accumulate, inner_product,
        partial_sum, adjacent_difference): Make conditionally constexpr for
index d832663..bad89c5 100644 (file)
@@ -2841,7 +2841,7 @@ namespace views
          friend constexpr bool
          operator==(const _InnerIter& __x, const _InnerIter& __y)
            requires forward_range<_Base>
-         { return __x._M_i.__current() == __y._M_i.__current(); }
+         { return __x._M_i == __y._M_i; }
 
          friend constexpr bool
          operator==(const _InnerIter& __x, default_sentinel_t)
index e25031c..52b015c 100644 (file)
@@ -91,6 +91,23 @@ test04()
   VERIFY( i == v.end() );
 }
 
+void
+test05()
+{
+  auto as_string = [](ranges::view auto rng) {
+    auto in = rng | views::common;
+    return std::string(in.begin(), in.end());
+  };
+  std::string str
+    = "Now is the time for all good men to come to the aid of their county.";
+  auto rng
+    = str | views::split(' ') | views::transform(as_string) | views::common;
+  std::vector<std::string> words(rng.begin(), rng.end());
+  auto not_space_p = [](char c) { return c != ' '; };
+  VERIFY( ranges::equal(words | views::join,
+                       str | views::filter(not_space_p)) );
+}
+
 int
 main()
 {
@@ -98,4 +115,5 @@ main()
   test02();
   test03();
   test04();
+  test05();
 }