https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99117
--- Comment #15 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
So, based on IRC discussion, the problem is that in:
template<typename _Tp> template<class _Dom>
inline valarray<_Tp>&
valarray<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 630. arrays of valarray.
if (_M_size == __e.size())
std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
the temporary _Array<_Tp>(_M_data) object's _M_data passed to __valarray_copy
doesn't fully own the object and that __e's operator[] aliases with that.
Can't libstdc++ for cases where such aliasing is possible use an _Array-like
class without the __restrict (i.e. something that wouldn't lie to the compiler
that it fully owns it)?