]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Missing constexpr for __gnu_debug::__valid_range etc
authorJonathan Wakely <jwakely@redhat.com>
Mon, 1 Nov 2021 12:27:43 +0000 (12:27 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Mon, 1 Nov 2021 21:01:31 +0000 (21:01 +0000)
The new 25_algorithms/move/constexpr.cc test fails in debug mode,
because the debug assertions use the non-constexpr overloads in
<debug/stl_iterator.h>.

libstdc++-v3/ChangeLog:

* include/debug/stl_iterator.h (__valid_range): Add constexpr
for C++20. Qualify call to avoid ADL.
(__get_distance, __can_advance, __unsafe, __base): Likewise.
* testsuite/25_algorithms/move/constexpr.cc: Also check with
std::reverse_iterator arguments.

libstdc++-v3/include/debug/stl_iterator.h
libstdc++-v3/testsuite/25_algorithms/move/constexpr.cc

index edeb42ebe980307f82db68032255fdbc8450b6ce..54f7d42b074c19da440ce0a69d0843a49fd8a4c6 100644 (file)
@@ -35,31 +35,38 @@ namespace __gnu_debug
 {
   // Help Debug mode to see through reverse_iterator.
   template<typename _Iterator>
+    _GLIBCXX20_CONSTEXPR
     inline bool
     __valid_range(const std::reverse_iterator<_Iterator>& __first,
                  const std::reverse_iterator<_Iterator>& __last,
                  typename _Distance_traits<_Iterator>::__type& __dist)
-    { return __valid_range(__last.base(), __first.base(), __dist); }
+    {
+      return __gnu_debug::__valid_range(__last.base(), __first.base(), __dist);
+    }
 
   template<typename _Iterator>
+    _GLIBCXX20_CONSTEXPR
     inline typename _Distance_traits<_Iterator>::__type
     __get_distance(const std::reverse_iterator<_Iterator>& __first,
                   const std::reverse_iterator<_Iterator>& __last)
-    { return __get_distance(__last.base(), __first.base()); }
+    { return __gnu_debug::__get_distance(__last.base(), __first.base()); }
 
   template<typename _Iterator, typename _Size>
+    _GLIBCXX20_CONSTEXPR
     inline bool
     __can_advance(const std::reverse_iterator<_Iterator>& __it, _Size __n)
-    { return __can_advance(__it.base(), -__n); }
+    { return __gnu_debug::__can_advance(__it.base(), -__n); }
 
   template<typename _Iterator, typename _Diff>
+    _GLIBCXX20_CONSTEXPR
     inline bool
     __can_advance(const std::reverse_iterator<_Iterator>& __it,
                  const std::pair<_Diff, _Distance_precision>& __dist,
                  int __way)
-    { return __can_advance(__it.base(), __dist, -__way); }
+    { return __gnu_debug::__can_advance(__it.base(), __dist, -__way); }
 
   template<typename _Iterator, typename _Sequence>
+    _GLIBCXX20_CONSTEXPR
     inline std::reverse_iterator<_Iterator>
     __base(const std::reverse_iterator<_Safe_iterator<
             _Iterator, _Sequence, std::random_access_iterator_tag> >& __it)
@@ -82,6 +89,7 @@ namespace __gnu_debug
     }
 #else
   template<typename _Iterator>
+    _GLIBCXX20_CONSTEXPR
     inline auto
     __unsafe(const std::reverse_iterator<_Iterator>& __it)
     -> decltype(std::__make_reverse_iterator(__unsafe(__it.base())))
@@ -91,37 +99,45 @@ namespace __gnu_debug
 #if __cplusplus >= 201103L
   // Help Debug mode to see through move_iterator.
   template<typename _Iterator>
+    _GLIBCXX20_CONSTEXPR
     inline bool
     __valid_range(const std::move_iterator<_Iterator>& __first,
                  const std::move_iterator<_Iterator>& __last,
                  typename _Distance_traits<_Iterator>::__type& __dist)
-    { return __valid_range(__first.base(), __last.base(), __dist); }
+    {
+      return __gnu_debug::__valid_range(__first.base(), __last.base(), __dist);
+    }
 
   template<typename _Iterator>
+    _GLIBCXX20_CONSTEXPR
     inline typename _Distance_traits<_Iterator>::__type
     __get_distance(const std::move_iterator<_Iterator>& __first,
                   const std::move_iterator<_Iterator>& __last)
-    { return __get_distance(__first.base(), __last.base()); }
+    { return __gnu_debug::__get_distance(__first.base(), __last.base()); }
 
   template<typename _Iterator, typename _Size>
+    _GLIBCXX20_CONSTEXPR
     inline bool
     __can_advance(const std::move_iterator<_Iterator>& __it, _Size __n)
-    { return __can_advance(__it.base(), __n); }
+    { return __gnu_debug::__can_advance(__it.base(), __n); }
 
   template<typename _Iterator, typename _Diff>
+    _GLIBCXX20_CONSTEXPR
     inline bool
     __can_advance(const std::move_iterator<_Iterator>& __it,
                  const std::pair<_Diff, _Distance_precision>& __dist,
                  int __way)
-    { return __can_advance(__it.base(), __dist, __way); }
+    { return __gnu_debug::__can_advance(__it.base(), __dist, __way); }
 
   template<typename _Iterator>
+    _GLIBCXX20_CONSTEXPR
     inline auto
     __unsafe(const std::move_iterator<_Iterator>& __it)
     -> decltype(std::make_move_iterator(__unsafe(__it.base())))
     { return std::make_move_iterator(__unsafe(__it.base())); }
 
   template<typename _Iterator>
+    _GLIBCXX20_CONSTEXPR
     inline auto
     __base(const std::move_iterator<_Iterator>& __it)
     -> decltype(std::make_move_iterator(__base(__it.base())))
index 773c55cfb50164a415159106c0a7c4e832d1dbce..eb1f3b17e723ae706e662a5cfd123bf42a42df69 100644 (file)
@@ -17,3 +17,14 @@ test01()
 }
 
 static_assert(test01());
+
+constexpr bool
+test02()
+{
+  int x[2] = {1,2}, y[2];
+  std::span in(x), out(y);
+  std::move(in.rbegin(), in.rend(), out.rbegin());
+  return std::equal(in.rbegin(), in.rend(), out.rbegin());
+}
+
+static_assert(test02());