https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99117

--- Comment #16 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So perhaps (totally untested):
--- libstdc++-v3/include/std/valarray.jj        2021-01-04 10:26:02.366967342
+0100
+++ libstdc++-v3/include/std/valarray   2021-02-23 15:16:22.402688841 +0100
@@ -838,7 +838,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 630. arrays of valarray.
       if (_M_size == __e.size())
-       std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
+       std::__valarray_copy(__e, _M_size, _M_data);
       else
        {
          if (_M_data)
--- libstdc++-v3/include/bits/valarray_array.tcc.jj     2021-01-04
10:26:03.768951467 +0100
+++ libstdc++-v3/include/bits/valarray_array.tcc        2021-02-23
15:15:29.273282041 +0100
@@ -146,6 +146,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        *__p = __e[__i];
     }

+  // Copy n consecutive elements of e into consecutive elements of p.
+  // I.e. p[i] = e[i].  p can alias what e uses.
+  template<typename _Tp, class _Dom>
+    void
+    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Tp* __p)
+    {
+      for (size_t __i = 0; __i < __n; ++__i, ++__p)
+       *__p = __e[__i];
+    }
+
   // Copy n consecutive elements of e into elements of a using stride
   // s.  I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2].
   template<typename _Tp, class _Dom>

Reply via email to