https://gcc.gnu.org/g:955316dfc2af3cc5e7bf6b6418f7a2e60820f89f

commit r17-755-g955316dfc2af3cc5e7bf6b6418f7a2e60820f89f
Author: Tomasz Kamiński <[email protected]>
Date:   Fri May 15 13:41:16 2026 +0200

    libstdc++: Add begin, end, (const_)iterator members to valarray.
    
    This implements additions from sections 4.3, 4.4, 4.5 of P3016R6.
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/version.def (valarray): Define.
            * include/bits/version.h: Regenerate.
            * include/std/valarray: (__cpp_lib_valarray): Define.
            (valarray::begin, valarray::end, valarray::iterator)
            (valarray::const_iterator) [__glibcxx_valarray >= 202511L]: Define.
            (std::begin(valarray<_Tp>&), std::begin(const valarray<_Tp>&))
            (std::end(valarray<_Tp>&), std::end(const valarray<_Tp>&)): Define
            only if __glibcxx_valarray < 202511L (i.e. not defined).
            * include/bits/range_access.h (std::valarray)
            (std::begin(valarray<_Tp>&), std::begin(const valarray<_Tp>&))
            (std::end(valarray<_Tp>&), std::end(const valarray<_Tp>&)): Forward
            declare only if __glibcxx_valarray < 202511L (i.e. not defined).
            * testsuite/26_numerics/valarray/range_access3.cc: New test.
    
    Reviewed-by: Jonathan Wakely <[email protected]>
    Reviewed-by: Nathan Myers <[email protected]>
    Signed-off-by: Tomasz Kamiński <[email protected]>

Diff:
---
 libstdc++-v3/include/bits/range_access.h           |  2 +
 libstdc++-v3/include/bits/version.def              |  8 ++++
 libstdc++-v3/include/bits/version.h                | 10 +++++
 libstdc++-v3/include/std/valarray                  | 41 ++++++++++++++++++-
 .../26_numerics/valarray/range_access3.cc          | 47 ++++++++++++++++++++++
 5 files changed, 106 insertions(+), 2 deletions(-)

diff --git a/libstdc++-v3/include/bits/range_access.h 
b/libstdc++-v3/include/bits/range_access.h
index b89129f0233b..01f790868522 100644
--- a/libstdc++-v3/include/bits/range_access.h
+++ b/libstdc++-v3/include/bits/range_access.h
@@ -119,12 +119,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 #if __cplusplus >= 201402L
 
+#if __glibcxx_valarray < 202511L
   template<typename _Tp> class valarray;
   // These overloads must be declared for cbegin and cend to use them.
   template<typename _Tp> _Tp* begin(valarray<_Tp>&) noexcept;
   template<typename _Tp> const _Tp* begin(const valarray<_Tp>&) noexcept;
   template<typename _Tp> _Tp* end(valarray<_Tp>&) noexcept;
   template<typename _Tp> const _Tp* end(const valarray<_Tp>&) noexcept;
+#endif
 
   /**
    *  @brief  Return an iterator pointing to the first element of
diff --git a/libstdc++-v3/include/bits/version.def 
b/libstdc++-v3/include/bits/version.def
index 14337b5b6b6d..2f32a8bda98f 100644
--- a/libstdc++-v3/include/bits/version.def
+++ b/libstdc++-v3/include/bits/version.def
@@ -2418,6 +2418,14 @@ ftms = {
   };
 };
 
+ftms = {
+  name = valarray;
+  values = {
+    v = 202511;
+    cxxmin = 26; 
+  };
+};
+
 // Standard test specifications.
 stds[97] = ">= 199711L";
 stds[03] = ">= 199711L";
diff --git a/libstdc++-v3/include/bits/version.h 
b/libstdc++-v3/include/bits/version.h
index 9402f25df375..517b9020ec65 100644
--- a/libstdc++-v3/include/bits/version.h
+++ b/libstdc++-v3/include/bits/version.h
@@ -2685,4 +2685,14 @@
 #endif /* !defined(__cpp_lib_initializer_list) */
 #undef __glibcxx_want_initializer_list
 
+#if !defined(__cpp_lib_valarray)
+# if (__cplusplus >  202302L)
+#  define __glibcxx_valarray 202511L
+#  if defined(__glibcxx_want_all) || defined(__glibcxx_want_valarray)
+#   define __cpp_lib_valarray 202511L
+#  endif
+# endif
+#endif /* !defined(__cpp_lib_valarray) */
+#undef __glibcxx_want_valarray
+
 #undef __glibcxx_want_all
diff --git a/libstdc++-v3/include/std/valarray 
b/libstdc++-v3/include/std/valarray
index abb158d22c35..5a1f5c0ac5e8 100644
--- a/libstdc++-v3/include/std/valarray
+++ b/libstdc++-v3/include/std/valarray
@@ -46,6 +46,9 @@
 #include <bits/range_access.h>
 #endif
 
+#define __glibcxx_want_valarray
+#include <bits/version.h>
+
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -139,6 +142,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        };
     public:
       typedef _Tp value_type;
+#if __glibcxx_valarray >= 202511L
+      typedef _Tp* iterator;
+      typedef const _Tp* const_iterator;
+#endif
 
        // _lib.valarray.cons_ construct/destroy:
       ///  Construct an empty array.
@@ -572,6 +579,36 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        */
       void resize(size_t __size, _Tp __c = _Tp());
 
+#if __glibcxx_valarray >= 202511L
+      /**
+        *  @brief  Return an iterator pointing to the first element of
+        *          the valarray.
+        */
+      [[nodiscard]]
+      iterator
+      begin() noexcept
+      { return _M_data; }
+
+      [[nodiscard]]
+      const_iterator
+      begin() const noexcept
+      { return _M_data; }
+
+      /**
+        *  @brief  Return an iterator pointing to one past the last element of
+        *          the valarray.
+        */
+      [[nodiscard]]
+      iterator
+      end() noexcept
+      { return _M_data + _M_size; }
+
+      [[nodiscard]]
+      const_iterator
+      end() const noexcept
+      { return _M_data + _M_size; }
+#endif
+
     private:
       size_t _M_size;
       _Tp* __restrict__ _M_data;
@@ -1218,7 +1255,7 @@ _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
 #undef _DEFINE_BINARY_OPERATOR
   /// @endcond
 
-#if __cplusplus >= 201103L
+#if (__cplusplus >= 201103L) && (__glibcxx_valarray < 202511L)
   /**
    *  @brief  Return an iterator pointing to the first element of
    *          the valarray.
@@ -1272,7 +1309,7 @@ _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
       else
        return nullptr;
     }
-#endif // C++11
+#endif // C++11 to C++23
 
   /// @} group numeric_arrays
 
diff --git a/libstdc++-v3/testsuite/26_numerics/valarray/range_access3.cc 
b/libstdc++-v3/testsuite/26_numerics/valarray/range_access3.cc
new file mode 100644
index 000000000000..09ee7dc3e050
--- /dev/null
+++ b/libstdc++-v3/testsuite/26_numerics/valarray/range_access3.cc
@@ -0,0 +1,47 @@
+// { dg-do run { target c++26 } }
+
+#include <valarray>
+#include <testsuite_hooks.h>
+
+#ifndef __cpp_lib_valarray
+# error "Feature-test macro for text_encoding missing in <initializer_list>"
+#elif __cpp_lib_valarray != 202511L
+# error "Feature-test macro for text_encoding has wrong value in 
<initializer_list>"
+#endif
+
+void
+test01()
+{
+  std::valarray<double> va(3);
+  va[0] = 1.0; va[1] = 2.0; va[2] = 3.0;
+
+  typename std::valarray<double>::iterator it = va.begin();
+  VERIFY( it != va.end() );
+  VERIFY( *it++ == 1.0 );
+  VERIFY( *it++ == 2.0 );
+  VERIFY( *it++ == 3.0 );
+  VERIFY( it == va.end() );
+
+  const std::valarray<double>& cva = va;
+  typename std::valarray<double>::const_iterator cit = cva.begin();
+  VERIFY( cit != va.end() );
+  VERIFY( *cit++ == 1.0 );
+  VERIFY( *cit++ == 2.0 );
+  VERIFY( *cit++ == 3.0 );
+  VERIFY( cit == cva.end() );
+}
+
+void
+test02()
+{
+  std::valarray<double> va;
+  VERIFY( va.begin() == va.end() );
+  const std::valarray<double>& cva = va;
+  VERIFY( cva.begin() == cva.end() );
+}
+
+int main()
+{
+  test01();
+  test02();
+}

Reply via email to