diff mbox series

libstdc++: Fix use of inaccessible private member in split_view (PR93936)

Message ID 20200226133702.1231351-1-ppalka@redhat.com
State New
Headers show
Series libstdc++: Fix use of inaccessible private member in split_view (PR93936) | expand

Commit Message

Patrick Palka Feb. 26, 2020, 1:37 p.m. UTC
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/include/std/ranges                |  2 +-
 .../testsuite/std/ranges/adaptors/split.cc     | 18 ++++++++++++++++++
 2 files changed, 19 insertions(+), 1 deletion(-)

Comments

Jonathan Wakely Feb. 26, 2020, 2:28 p.m. UTC | #1
On 26/02/20 08:37 -0500, Patrick Palka wrote:
>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.

OK thanks.
diff mbox series

Patch

diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges
index 1bc95039cf2..62c637f35e0 100644
--- a/libstdc++-v3/include/std/ranges
+++ b/libstdc++-v3/include/std/ranges
@@ -2837,7 +2837,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)
diff --git a/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc b/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc
index e25031c0aea..52b015cf0c6 100644
--- a/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc
+++ b/libstdc++-v3/testsuite/std/ranges/adaptors/split.cc
@@ -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();
 }