--- /dev/null
+--- gcc/libstdc++-v3/include/bits/valarray_array.h (revision 110087)
++++ gcc/libstdc++-v3/include/bits/valarray_array.h (working copy)
+@@ -428,8 +428,24 @@
+ _Tp* const __restrict__ _M_data;
+ };
+
++
++ // Copy-construct plain array __b[<__n>] from indexed array __a[__i[<__n>]]
+ template<typename _Tp>
+ inline void
++ __valarray_copy_construct(_Array<_Tp> __a, _Array<size_t> __i,
++ _Array<_Tp> __b, size_t __n)
++ { std::__valarray_copy_construct(__a._M_data, __i._M_data,
++ __b._M_data, __n); }
++
++ // Copy-construct plain array __b[<__n>] from strided array __a[<__n : __s>]
++ template<typename _Tp>
++ inline void
++ __valarray_copy_construct(_Array<_Tp> __a, size_t __n, size_t __s,
++ _Array<_Tp> __b)
++ { std::__valarray_copy_construct(__a._M_data, __n, __s, __b._M_data); }
++
++ template<typename _Tp>
++ inline void
+ __valarray_fill (_Array<_Tp> __a, size_t __n, const _Tp& __t)
+ { std::__valarray_fill(__a._M_data, __n, __t); }
+
+--- gcc/libstdc++-v3/include/std/std_valarray.h (revision 110087)
++++ gcc/libstdc++-v3/include/std/std_valarray.h (working copy)
+@@ -584,7 +584,7 @@
+ valarray<_Tp>::valarray(const slice_array<_Tp>& __sa)
+ : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
+ {
+- std::__valarray_copy
++ std::__valarray_copy_construct
+ (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
+ }
+
+@@ -594,7 +594,7 @@
+ : _M_size(__ga._M_index.size()),
+ _M_data(__valarray_get_storage<_Tp>(_M_size))
+ {
+- std::__valarray_copy
++ std::__valarray_copy_construct
+ (__ga._M_array, _Array<size_t>(__ga._M_index),
+ _Array<_Tp>(_M_data), _M_size);
+ }
+@@ -604,7 +604,7 @@
+ valarray<_Tp>::valarray(const mask_array<_Tp>& __ma)
+ : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
+ {
+- std::__valarray_copy
++ std::__valarray_copy_construct
+ (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
+ }
+
+@@ -613,7 +613,7 @@
+ valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia)
+ : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
+ {
+- std::__valarray_copy
++ std::__valarray_copy_construct
+ (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
+ }
+
+@@ -621,7 +621,7 @@
+ inline
+ valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e)
+ : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
+- { std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data)); }
++ { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); }
+
+ template<typename _Tp>
+ inline