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

--- Comment #9 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Something like this prevents the miscompilation, at the cost of an extra copy:

--- a/libstdc++-v3/include/std/valarray
+++ b/libstdc++-v3/include/std/valarray
@@ -838,7 +838,13 @@ _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));
+       {
+         if (__e()._M_expr1._M_data == _M_data
+             || __e()._M_expr2._M_data == _M_data)
+           *this = static_cast<valarray>(__e);
+         else
+           std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
+       }
       else
        {
          if (_M_data)

(This isn't usable because it accesses private members so only compiles with
-fno-access-control, but I wanted to see if it helped).

Reply via email to