As discussed at https://gcc.gnu.org/ml/libstdc++/2018-01/msg00073.html we can simplify the allocator function for valarray memory. I also noticed that the _Array(size_t) constructor is never used.
* include/bits/valarray_array.h (__valarray_get_memory): Remove. (__valarray_get_storage): Call operator new directly. Remove ignored top-level restrict qualifier and add malloc attribute instead. (_Array<_Tp>::_Array(size_t)): Remove unused constructor. Tested powerpc64le-linux, committed to trunk.
commit 71983b7d0901159af2bca65af783460721fc0a76 Author: Jonathan Wakely <jwak...@redhat.com> Date: Mon May 14 16:02:18 2018 +0100 Add __attribute__((malloc) to allocator and remove unused code * include/bits/valarray_array.h (__valarray_get_memory): Remove. (__valarray_get_storage): Call operator new directly. Remove ignored top-level restrict qualifier and add malloc attribute instead. (_Array<_Tp>::_Array(size_t)): Remove unused constructor. diff --git a/libstdc++-v3/include/bits/valarray_array.h b/libstdc++-v3/include/bits/valarray_array.h index 07f38ed03ed..6759d6003e9 100644 --- a/libstdc++-v3/include/bits/valarray_array.h +++ b/libstdc++-v3/include/bits/valarray_array.h @@ -47,18 +47,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // Helper functions on raw pointers // - // We get memory by the old fashion way - inline void* - __valarray_get_memory(size_t __n) - { return operator new(__n); } + // We get memory the old fashioned way + template<typename _Tp> + _Tp* + __valarray_get_storage(size_t) __attribute__((__malloc__)); template<typename _Tp> - inline _Tp*__restrict__ + inline _Tp* __valarray_get_storage(size_t __n) - { - return static_cast<_Tp*__restrict__> - (std::__valarray_get_memory(__n * sizeof(_Tp))); - } + { return static_cast<_Tp*>(operator new(__n * sizeof(_Tp))); } // Return memory to the system inline void @@ -410,7 +407,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION template<typename _Tp> struct _Array { - explicit _Array(size_t); explicit _Array(_Tp* const __restrict__); explicit _Array(const valarray<_Tp>&); _Array(const _Tp* __restrict__, size_t); @@ -503,12 +499,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __dst._M_data, __j._M_data); } - template<typename _Tp> - inline - _Array<_Tp>::_Array(size_t __n) - : _M_data(__valarray_get_storage<_Tp>(__n)) - { std::__valarray_default_construct(_M_data, _M_data + __n); } - template<typename _Tp> inline _Array<_Tp>::_Array(_Tp* const __restrict__ __p)