[committed] libstdc++: Missing constexpr for __gnu_debug::__valid_range etc

Message ID 20211101235220.1457278-1-jwakely@redhat.com
State Committed
Commit 6f34b9e4f1eb7aa3398aaf135cbb24680eaad1b1
Headers
Series [committed] libstdc++: Missing constexpr for __gnu_debug::__valid_range etc |

Commit Message

Jonathan Wakely Nov. 1, 2021, 11:52 p.m. UTC
  Tested powerpc64le-linux, pushed to trunk.


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     | 32 ++++++++++++++-----
 .../testsuite/25_algorithms/move/constexpr.cc | 11 +++++++
 2 files changed, 35 insertions(+), 8 deletions(-)
  

Patch

diff --git a/libstdc++-v3/include/debug/stl_iterator.h b/libstdc++-v3/include/debug/stl_iterator.h
index edeb42ebe98..54f7d42b074 100644
--- a/libstdc++-v3/include/debug/stl_iterator.h
+++ b/libstdc++-v3/include/debug/stl_iterator.h
@@ -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())))
diff --git a/libstdc++-v3/testsuite/25_algorithms/move/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/move/constexpr.cc
index 773c55cfb50..eb1f3b17e72 100644
--- a/libstdc++-v3/testsuite/25_algorithms/move/constexpr.cc
+++ b/libstdc++-v3/testsuite/25_algorithms/move/constexpr.cc
@@ -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());