]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Revert final/non-addressable changes to ranges CPOs
authorJonathan Wakely <jwakely@redhat.com>
Wed, 16 Jun 2021 11:34:52 +0000 (12:34 +0100)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 16 Jun 2021 13:31:04 +0000 (14:31 +0100)
In r12-1489-g8b93548778a487f31f21e0c6afe7e0bde9711fc4 I made the
[range.access] CPO types final and non-addressable. Tim Song pointed out
this is wrong. Only the [range.iter.ops] functions should be final and
non-addressable. Revert the changes to the [range.access] objects.

Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:

* include/bits/ranges_base.h (ranges::begin, ranges::end)
(ranges::cbegin, ranges::cend, ranges::rbeing, ranges::rend)
(ranges::crbegin, ranges::crend, ranges::size, ranges::ssize)
(ranges::empty, ranges::data, ranges::cdata): Remove final
keywords and deleted operator& overloads.
* testsuite/24_iterators/customization_points/iter_move.cc: Use
new is_customization_point_object function.
* testsuite/24_iterators/customization_points/iter_swap.cc:
Likewise.
* testsuite/std/concepts/concepts.lang/concept.swappable/swap.cc:
Likewise.
* testsuite/std/ranges/access/begin.cc: Likewise.
* testsuite/std/ranges/access/cbegin.cc: Likewise.
* testsuite/std/ranges/access/cdata.cc: Likewise.
* testsuite/std/ranges/access/cend.cc: Likewise.
* testsuite/std/ranges/access/crbegin.cc: Likewise.
* testsuite/std/ranges/access/crend.cc: Likewise.
* testsuite/std/ranges/access/data.cc: Likewise.
* testsuite/std/ranges/access/empty.cc: Likewise.
* testsuite/std/ranges/access/end.cc: Likewise.
* testsuite/std/ranges/access/rbegin.cc: Likewise.
* testsuite/std/ranges/access/rend.cc: Likewise.
* testsuite/std/ranges/access/size.cc: Likewise.
* testsuite/std/ranges/access/ssize.cc: Likewise.
* testsuite/util/testsuite_iterators.h
(is_customization_point_object): New function.

18 files changed:
libstdc++-v3/include/bits/ranges_base.h
libstdc++-v3/testsuite/24_iterators/customization_points/iter_move.cc
libstdc++-v3/testsuite/24_iterators/customization_points/iter_swap.cc
libstdc++-v3/testsuite/std/concepts/concepts.lang/concept.swappable/swap.cc
libstdc++-v3/testsuite/std/ranges/access/begin.cc
libstdc++-v3/testsuite/std/ranges/access/cbegin.cc
libstdc++-v3/testsuite/std/ranges/access/cdata.cc
libstdc++-v3/testsuite/std/ranges/access/cend.cc
libstdc++-v3/testsuite/std/ranges/access/crbegin.cc
libstdc++-v3/testsuite/std/ranges/access/crend.cc
libstdc++-v3/testsuite/std/ranges/access/data.cc
libstdc++-v3/testsuite/std/ranges/access/empty.cc
libstdc++-v3/testsuite/std/ranges/access/end.cc
libstdc++-v3/testsuite/std/ranges/access/rbegin.cc
libstdc++-v3/testsuite/std/ranges/access/rend.cc
libstdc++-v3/testsuite/std/ranges/access/size.cc
libstdc++-v3/testsuite/std/ranges/access/ssize.cc
libstdc++-v3/testsuite/util/testsuite_iterators.h

index e392c370fcd335832673d1db1ac3f42c1e6463e6..25af4b742a632f81c6562e60bf307d0e5014db22 100644 (file)
@@ -91,7 +91,7 @@ namespace ranges
     using std::ranges::__detail::__maybe_borrowed_range;
     using std::__detail::__range_iter_t;
 
-    struct _Begin final
+    struct _Begin
     {
     private:
       template<typename _Tp>
@@ -106,8 +106,6 @@ namespace ranges
            return noexcept(__decay_copy(begin(std::declval<_Tp&>())));
        }
 
-      void operator&() const = delete;
-
     public:
       template<__maybe_borrowed_range _Tp>
        requires is_array_v<remove_reference_t<_Tp>> || __member_begin<_Tp>
@@ -144,7 +142,7 @@ namespace ranges
          { __decay_copy(end(__t)) } -> sentinel_for<__range_iter_t<_Tp>>;
        };
 
-    struct _End final
+    struct _End
     {
     private:
       template<typename _Tp>
@@ -159,8 +157,6 @@ namespace ranges
            return noexcept(__decay_copy(end(std::declval<_Tp&>())));
        }
 
-      void operator&() const = delete;
-
     public:
       template<__maybe_borrowed_range _Tp>
        requires is_bounded_array_v<remove_reference_t<_Tp>>
@@ -193,7 +189,7 @@ namespace ranges
          return static_cast<const _Tp&&>(__t);
       }
 
-    struct _CBegin final
+    struct _CBegin
     {
       template<typename _Tp>
        constexpr auto
@@ -203,8 +199,6 @@ namespace ranges
        {
          return _Begin{}(__cust_access::__as_const<_Tp>(__e));
        }
-
-      void operator&() const = delete;
     };
 
     struct _CEnd final
@@ -217,8 +211,6 @@ namespace ranges
        {
          return _End{}(__cust_access::__as_const<_Tp>(__e));
        }
-
-      void operator&() const = delete;
     };
 
     template<typename _Tp>
@@ -244,7 +236,7 @@ namespace ranges
          { _End{}(__t) } -> same_as<decltype(_Begin{}(__t))>;
        };
 
-    struct _RBegin final
+    struct _RBegin
     {
     private:
       template<typename _Tp>
@@ -268,8 +260,6 @@ namespace ranges
            }
        }
 
-      void operator&() const = delete;
-
     public:
       template<__maybe_borrowed_range _Tp>
        requires __member_rbegin<_Tp> || __adl_rbegin<_Tp> || __reversable<_Tp>
@@ -304,7 +294,7 @@ namespace ranges
            -> sentinel_for<decltype(_RBegin{}(std::forward<_Tp>(__t)))>;
        };
 
-    struct _REnd final
+    struct _REnd
     {
     private:
       template<typename _Tp>
@@ -328,8 +318,6 @@ namespace ranges
            }
        }
 
-      void operator&() const = delete;
-
     public:
       template<__maybe_borrowed_range _Tp>
        requires __member_rend<_Tp> || __adl_rend<_Tp> || __reversable<_Tp>
@@ -346,7 +334,7 @@ namespace ranges
        }
     };
 
-    struct _CRBegin final
+    struct _CRBegin
     {
       template<typename _Tp>
        constexpr auto
@@ -356,11 +344,9 @@ namespace ranges
        {
          return _RBegin{}(__cust_access::__as_const<_Tp>(__e));
        }
-
-      void operator&() const = delete;
     };
 
-    struct _CREnd final
+    struct _CREnd
     {
       template<typename _Tp>
        constexpr auto
@@ -370,8 +356,6 @@ namespace ranges
        {
          return _REnd{}(__cust_access::__as_const<_Tp>(__e));
        }
-
-      void operator&() const = delete;
     };
 
     template<typename _Tp>
@@ -402,7 +386,7 @@ namespace ranges
          __detail::__to_unsigned_like(_End{}(__t) - _Begin{}(__t));
        };
 
-    struct _Size final
+    struct _Size
     {
     private:
       template<typename _Tp>
@@ -420,8 +404,6 @@ namespace ranges
                            - _Begin{}(std::declval<_Tp&>()));
        }
 
-      void operator&() const = delete;
-
     public:
       template<typename _Tp>
        requires is_bounded_array_v<remove_reference_t<_Tp>>
@@ -440,7 +422,7 @@ namespace ranges
        }
     };
 
-    struct _SSize final
+    struct _SSize
     {
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 3403. Domain of ranges::ssize(E) doesn't match ranges::size(E)
@@ -469,8 +451,6 @@ namespace ranges
          else // Must be one of __max_diff_type or __max_size_type.
            return __detail::__max_diff_type(__size);
        }
-
-      void operator&() const = delete;
     };
 
     template<typename _Tp>
@@ -487,7 +467,7 @@ namespace ranges
          bool(_Begin{}(__t) == _End{}(__t));
        };
 
-    struct _Empty final
+    struct _Empty
     {
     private:
       template<typename _Tp>
@@ -503,8 +483,6 @@ namespace ranges
                == _End{}(std::declval<_Tp&>())));
        }
 
-      void operator&() const = delete;
-
     public:
       template<typename _Tp>
        requires __member_empty<_Tp> || __size0_empty<_Tp>
@@ -534,7 +512,7 @@ namespace ranges
     template<typename _Tp>
       concept __begin_data = contiguous_iterator<__range_iter_t<_Tp>>;
 
-    struct _Data final
+    struct _Data
     {
     private:
       template<typename _Tp>
@@ -547,8 +525,6 @@ namespace ranges
            return noexcept(_Begin{}(std::declval<_Tp&>()));
        }
 
-      void operator&() const = delete;
-
     public:
       template<__maybe_borrowed_range _Tp>
        requires __member_data<_Tp> || __begin_data<_Tp>
@@ -562,7 +538,7 @@ namespace ranges
        }
     };
 
-    struct _CData final
+    struct _CData
     {
       template<typename _Tp>
        constexpr auto
@@ -572,8 +548,6 @@ namespace ranges
        {
          return _Data{}(__cust_access::__as_const<_Tp>(__e));
        }
-
-      void operator&() const = delete;
     };
 
   } // namespace __cust_access
index 22030eca9a7faa8b50f0349b204733c98c507e2b..a43448581f304d74d0994b8efb149c8f5a64407c 100644 (file)
@@ -20,6 +20,9 @@
 
 #include <iterator>
 #include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+static_assert(__gnu_test::is_customization_point_object(std::ranges::iter_move));
 
 struct X
 {
index 35802723d60a9c2436eb2d2ba0598797e726ee4d..f170e177d3027ccd352056ecef45eb4c10ea6de6 100644 (file)
@@ -20,6 +20,9 @@
 
 #include <iterator>
 #include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+static_assert(__gnu_test::is_customization_point_object(std::ranges::iter_swap));
 
 struct X
 {
index 4479c26f30b79d1825dfd059cc6d66ce88d0e63e..ea469e953b24b8cba410039306bab00cf45721f3 100644 (file)
 // { dg-do compile { target c++2a } }
 
 #include <concepts>
+#include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+static_assert(__gnu_test::is_customization_point_object(std::ranges::swap));
 
 namespace nu
 {
index 6ef44ee631c72e8117084aa1ac485b2501abf202..a08ad37fd34db4abff5dac0abe7abcc644768757 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::begin));
+
 using std::same_as;
 
 void
index dc06695139ee0ca0c0e4642e9fcea5c5b9487922..ed80af589cfe07d59bbfa0d456a7f235772c84fe 100644 (file)
 
 #include <ranges>
 #include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+static_assert(__gnu_test::is_customization_point_object(std::ranges::cbegin));
+
 using std::same_as;
 
 void
index 2dfb68307892498cef3c1ea5d734826156b7a619..d51ff1d32eb566980af45a0fa46c095bff57ea19 100644 (file)
@@ -20,6 +20,9 @@
 
 #include <ranges>
 #include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+static_assert(__gnu_test::is_customization_point_object(std::ranges::cdata));
 
 template<typename T>
   concept has_cdata
index fcb80f28d3abfb2caa57160094f9527c3ef59823..3e685ae9ce23dc8af8a4fe5181c140533d6242ed 100644 (file)
@@ -20,6 +20,9 @@
 
 #include <ranges>
 #include <testsuite_hooks.h>
+#include <testsuite_iterators.h>
+
+static_assert(__gnu_test::is_customization_point_object(std::ranges::cend));
 
 using std::same_as;
 
index a41234b2dd48384706bd6d12fd26f907515edfb9..6b02b478a151c8a52a2363d3132996dcff64c127 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::crbegin));
+
 struct R1
 {
   int i = 0;
index 8f8b08abd3f59ea782dba5138b51c8d490b53211..eb010d9d477945f1e7dfb982208e98f88a356133 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::crend));
+
 struct R1
 {
   int i = 0;
index 4f16f447f9fc24763f419305afa41c5412b3e2ec..b2083d1890e7764650dea76582985ea585fbd837 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::data));
+
 template<typename T>
   concept has_data
     = requires (T&& t) { std::ranges::data(std::forward<T>(t)); };
index b2d8b10532565c46777f7ce8d65999864eba2b90..3cad47401240438d34ef11715150d02939e6cae5 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::empty));
+
 using std::same_as;
 
 void
index 7bf0dd44bb37f96c8d189a0c1e86a9a626571d11..25f21c75afc4bf891f746a8f6eb088e71333c48d 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::end));
+
 using std::same_as;
 
 void
index a166ad7434875b2defad90a36922d62e7b36b295..0006f89d4c56f89dba0612cce41e673735ef2dd9 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::rbegin));
+
 struct R1
 {
   int i = 0;
index 4ba5447c74a10eee91488a19066bc8c0a6863113..0ac86bc8d4bb3c647a43f00dd9eb63ab386fda74 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::rend));
+
 struct R1
 {
   int i = 0;
index f25a1cb9ddb62a47623f92e19babdbd4219767a1..c7e4f78f96a24960f93c7dbcb91632e7ace903e8 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::size));
+
 void
 test01()
 {
index fdbf245d036336d6177a7ec9dbcb6a04e6c2286b..7337f626a25ef192fdfa50c9aa76f010873438c5 100644 (file)
@@ -22,6 +22,8 @@
 #include <testsuite_hooks.h>
 #include <testsuite_iterators.h>
 
+static_assert(__gnu_test::is_customization_point_object(std::ranges::ssize));
+
 using std::ptrdiff_t;
 
 void
index 4e668d648f210486eab37970185d078d20544397..6b835ac475eeef3e252424cc2f06ee878eea3d46 100644 (file)
@@ -894,6 +894,22 @@ namespace __gnu_test
 // This is also true for test_container, although only when it has forward
 // iterators (because output_iterator_wrapper and input_iterator_wrapper are
 // not default constructible so do not model std::input_or_output_iterator).
+
+
+  // Test for basic properties of C++20 16.3.3.6 [customization.point.object].
+  template<typename T>
+    constexpr bool
+    is_customization_point_object(T& obj) noexcept
+    {
+      // A [CPO] is a function object with a literal class type.
+      static_assert( std::is_class_v<T> || std::is_union_v<T> );
+      static_assert( __is_literal_type(T) );
+      // The type of a [CPO], ignoring cv-qualifiers, shall model semiregular.
+      static_assert( std::semiregular<std::remove_cv_t<T>> );
+
+      return true;
+    }
+
 #endif // C++20
 } // namespace __gnu_test
 #endif // _TESTSUITE_ITERATORS