@@ -1568,23 +1568,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
namespace __detail
{
- template<input_or_output_iterator _It>
- class _Common_iter_proxy
- {
- iter_value_t<_It> _M_keep;
-
- _Common_iter_proxy(iter_reference_t<_It>&& __x)
- : _M_keep(std::move(__x)) { }
-
- template<typename _Iter, typename _Sent>
- friend class common_iterator;
-
- public:
- const iter_value_t<_It>*
- operator->() const
- { return std::__addressof(_M_keep); }
- };
-
template<typename _It>
concept __common_iter_has_arrow = indirectly_readable<const _It>
&& (requires(const _It& __it) { __it.operator->(); }
@@ -1613,6 +1596,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
_S_noexcept()
{ return _S_noexcept1<_It, _It2>() && _S_noexcept1<_Sent, _Sent2>(); }
+ class _Proxy
+ {
+ iter_value_t<_It> _M_keep;
+
+ _Proxy(iter_reference_t<_It>&& __x)
+ : _M_keep(std::move(__x)) { }
+
+ friend class common_iterator;
+
+ public:
+ const iter_value_t<_It>*
+ operator->() const
+ { return std::__addressof(_M_keep); }
+ };
+
public:
constexpr
common_iterator()
@@ -1769,7 +1767,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return std::__addressof(__tmp);
}
else
- return _Common_iter_proxy(*_M_it);
+ return _Proxy{*_M_it};
}
common_iterator&
new file mode 100644
@@ -0,0 +1,63 @@
+// Copyright (C) 2020 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <iterator>
+#include <testsuite_hooks.h>
+
+struct value { int n; };
+
+struct sentinel { int limit; };
+
+struct iterator
+{
+ using iterator_category = std::input_iterator_tag;
+ using value_type = value;
+ using difference_type = std::ptrdiff_t;
+ using reference = value;
+
+ value operator*() const { return value{counter}; }
+
+ iterator& operator++() { ++counter; return *this; }
+
+ iterator operator++(int) { auto i = *this; ++counter; return i; }
+
+ bool operator==(sentinel s) const { return counter == s.limit; }
+
+ int counter = 0;
+};
+
+void
+test01()
+{
+ iterator i;
+ sentinel s{2};
+ std::common_iterator<iterator, sentinel> begin = i, end = s;
+ VERIFY( begin->n == 0 );
+ ++begin;
+ VERIFY( begin->n == 1 );
+ ++begin;
+ VERIFY( begin == end );
+}
+
+int
+main()
+{
+ test01();
+}
new file mode 100644
@@ -0,0 +1,50 @@
+// Copyright (C) 2020 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library. This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING3. If not see
+// <http://www.gnu.org/licenses/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do run { target c++2a } }
+
+#include <ranges>
+#include <list>
+#include <testsuite_hooks.h>
+
+namespace ranges = std::ranges;
+namespace views = std::views;
+
+void
+test01()
+{
+ std::list container{1, 2, 3, 4, 5};
+ auto v = (container
+ | views::take(3)
+ | views::transform(std::negate{})
+ | views::common);
+ auto i = ranges::cbegin(v);
+ VERIFY( *i == -1 );
+ ++i;
+ VERIFY( *i == -2 );
+ ++i;
+ VERIFY( *i == -3 );
+ ++i;
+ VERIFY( i == ranges::end(v) );
+}
+
+int
+main()
+{
+ test01();
+}