libstdc++: Define __cpp_lib_ranges macro for C++20
authorJonathan Wakely <jwakely@redhat.com>
Fri, 27 Mar 2020 23:21:58 +0000 (23:21 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Fri, 27 Mar 2020 23:26:03 +0000 (23:26 +0000)
Define the feature test macro now that ranges support is complete.

This also changes the preprocessor checks for the __cpp_concepts macro
so that library components depending on concepts are only enabled when
C++20 concepts are supported, and not just for the Concepts TS (which
uses different syntax in places).

* include/bits/range_cmp.h (__cpp_lib_ranges): Define.
* include/bits/stl_iterator.h: Check value of __cpp_concepts so that
C++20 concepts are required.
* include/bits/stl_iterator_base_types.h: Likewise.
* include/std/concepts: Likewise.
* include/std/version: Likewise.
* testsuite/std/ranges/headers/ranges/synopsis.cc: Check feature test
macro.

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/range_cmp.h
libstdc++-v3/include/bits/stl_iterator.h
libstdc++-v3/include/bits/stl_iterator_base_types.h
libstdc++-v3/include/std/concepts
libstdc++-v3/include/std/version
libstdc++-v3/testsuite/24_iterators/move_iterator/move_only.cc
libstdc++-v3/testsuite/24_iterators/move_iterator/rel_ops_c++20.cc
libstdc++-v3/testsuite/std/ranges/headers/ranges/synopsis.cc

index fc5f900ed5f1cbd2cebf293736fa9c05f9fb79cb..3b96b23ca8f164054681f9f3b089704ab1bb9843 100644 (file)
@@ -1,5 +1,14 @@
 2020-03-27  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/bits/range_cmp.h (__cpp_lib_ranges): Define.
+       * include/bits/stl_iterator.h: Check value of __cpp_concepts so that
+       C++20 concepts are required.
+       * include/bits/stl_iterator_base_types.h: Likewise.
+       * include/std/concepts: Likewise.
+       * include/std/version: Likewise.
+       * testsuite/std/ranges/headers/ranges/synopsis.cc: Check feature test
+       macro.
+
        * include/bits/stl_iterator.h (reverse_iterator::iterator_concept)
        (reverse_iterator::iterator_category): Define for C++20.
        (reverse_iterator): Define comparison operators correctly for C++20.
index 571ba7f955510616e5ebee332b8392c669b31f00..0587c599c4be71c93415fddab5fe01384e97654e 100644 (file)
@@ -55,6 +55,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   };
 
 #ifdef __cpp_lib_concepts
+// Define this here, included by all the headers that need to define it.
+#define __cpp_lib_ranges 201911L
+
 namespace ranges
 {
   namespace __detail
index 26eb599993df4cd742c1bedf00571a3f6524ac56..e68f66a2b8975383da9af7018316823078e8a16b 100644 (file)
@@ -214,7 +214,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       */
       _GLIBCXX17_CONSTEXPR pointer
       operator->() const
-#if __cplusplus > 201703L && defined __cpp_concepts
+#if __cplusplus > 201703L && __cpp_concepts >= 201907L
       requires is_pointer_v<_Iterator>
        || requires(const _Iterator __i) { __i.operator->(); }
 #endif
index 431bf8a62d6bc934731cf6b4bfc04bb3ae167f8a..aa02af59dc6041931e678d44586e40ade92425b2 100644 (file)
@@ -67,7 +67,7 @@
 # include <type_traits>  // For __void_t, is_convertible
 #endif
 
-#if __cplusplus > 201703L && __cpp_concepts
+#if __cplusplus > 201703L && __cpp_concepts >= 201907L
 # include <bits/iterator_concepts.h>
 #endif
 
@@ -192,7 +192,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus > 201703L
   /// Partial specialization for object pointer types.
   template<typename _Tp>
-#if __cpp_concepts
+#if __cpp_concepts >= 201907L
     requires is_object_v<_Tp>
 #endif
     struct iterator_traits<_Tp*>
index ba232e953ecaefd77a20efd098ec732179f75e20..e8ce1adc93a012bf8726e00b2014cc4fd355c097 100644 (file)
@@ -30,7 +30,7 @@
 #ifndef _GLIBCXX_CONCEPTS
 #define _GLIBCXX_CONCEPTS 1
 
-#if __cplusplus > 201703L && __cpp_concepts
+#if __cplusplus > 201703L && __cpp_concepts >= 201907L
 
 #pragma GCC system_header
 
index c6a202e250d14cbd726a485504bdaee0df94bea5..d9a47ee8e8a35f63ff9f5ca9b6c0338c8f0c9f2d 100644 (file)
 #define __cpp_lib_nonmember_container_access 201411
 #define __cpp_lib_not_fn 201603
 #define __cpp_lib_optional 201606L
+#define __cpp_lib_parallel_algorithm 201603L
 #define __cpp_lib_raw_memory_algorithms 201606L
 #define __cpp_lib_sample 201603
 #ifdef _GLIBCXX_HAS_GTHREADS
 #define __cpp_lib_unordered_map_insertion 201411
 #define __cpp_lib_unordered_map_try_emplace 201411
 #define __cpp_lib_variant 201606L
-#define __cpp_lib_parallel_algorithm 201603L
 #endif
 
 #if __cplusplus > 201703L
 #define __cpp_lib_atomic_value_initialization 201911L
 #define __cpp_lib_bitops 201907L
 #define __cpp_lib_bounded_array_traits 201902L
-#if __cpp_concepts
+#if __cpp_concepts >= 201907L
 # define __cpp_lib_concepts 201806L
 #endif
 #if __cpp_impl_destroying_delete
 #endif
 #define __cpp_lib_list_remove_return_type 201806L
 #define __cpp_lib_math_constants 201907L
+#if __cpp_lib_concepts
+# define __cpp_lib_ranges 201911L
+#endif
 #define __cpp_lib_span 202002L
 #if __cpp_impl_three_way_comparison >= 201907L && __cpp_lib_concepts
 # define __cpp_lib_three_way_comparison 201711L
index d64e61e4448a8bdfa8f1d700fcf8c20494162198..eaf307ddf60ade6c0492b3f939b7a92d0ab4906d 100644 (file)
@@ -45,16 +45,17 @@ static_assert(std::input_iterator<move_only_iterator>);
 template<typename T>
   concept has_member_base = requires (T t) { std::forward<T>(t).base(); };
 
-static_assert( ! has_member_base<std::move_iterator<move_iterator>&> );
-static_assert( ! has_member_base<const std::move_iterator<move_iterator>&> );
-static_assert( has_member_base<std::move_iterator<move_iterator>> );
-static_assert( ! has_member_base<const std::move_iterator<move_iterator>> );
+using move_only_move_iterator = std::move_iterator<move_only_iterator>;
+
+static_assert( ! has_member_base<move_only_move_iterator&> );
+static_assert( ! has_member_base<const move_only_move_iterator&> );
+static_assert( has_member_base<move_only_move_iterator> );
+static_assert( ! has_member_base<const move_only_move_iterator> );
 
 void
 test01()
 {
-  std::move_iterator<move_only_iterator> m1, m2;
-  m1 = std::make_move_iterator(move_only_iterator{});
+  move_only_move_iterator m1 = std::make_move_iterator(move_only_iterator{});
+  move_only_move_iterator m2;
   m2 = std::move(m1);
-  m1.swap(m2);
 }
index 8f2d73c520f98724e6d2d3083d2452724624f091..4e7b9d01e15ff2f933a0561e40c3c4d5f169ebbd 100644 (file)
@@ -48,15 +48,10 @@ struct Iter
   template<int N> friend Iter operator-(Iter<N>, difference_type);
   template<int N> friend difference_type operator-(Iter<N>, Iter<N>);
 
-  // Define the full set of operators for same-type comparisons
-  template<int N> friend bool operator==(Iter<N>, Iter<N>); // synthesizes !=
-  template<int N> friend bool operator<(Iter<N>, Iter<N>);
-  template<int N> friend bool operator>(Iter<N>, Iter<N>);
-  template<int N> friend bool operator<=(Iter<N>, Iter<N>);
-  template<int N> friend bool operator>=(Iter<N>, Iter<N>);
+  template<int N> friend bool operator==(Iter<N>, Iter<N>);
+  template<int N> friend std::weak_ordering operator<=>(Iter<N>, Iter<N>);
 };
 
-
 static_assert( std::random_access_iterator<Iter<0>> );
 
 int   operator==(Iter<0>, long*);
index 10ccb35c9e1a764e1054bf79099f0977304ca8f7..dd24730398f9d54a4b1ae3eb7bbdfb04d81f3e8f 100644 (file)
 
 #include <ranges>
 
+#ifndef __cpp_lib_ranges
+# error "Feature test macro for ranges is missing in <ranges>"
+#elif __cpp_lib_ranges < 201911L
+# error "Feature test macro for ranges has wrong value in <ranges>"
+#endif
+
 struct R { };
 template<> constexpr bool std::ranges::disable_sized_range<R> = true;