#include <bits/c++config.h>
#include <bits/cpp_type_traits.h>
+#include <bits/new_allocator.h>
#include <cstdlib>
#include <new>
template<typename _Tp>
inline _Tp*
__valarray_get_storage(size_t __n)
- { return static_cast<_Tp*>(operator new(__n * sizeof(_Tp))); }
+ { return std::__new_allocator<_Tp>().allocate(__n); }
// Return memory to the system
- inline void
- __valarray_release_memory(void* __p)
- { operator delete(__p); }
+ template<typename _Tp>
+ inline void
+ __valarray_release_memory(_Tp* __p, size_t __n)
+ { std::__new_allocator<_Tp>().deallocate(__p, __n); }
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
valarray<_Tp>::~valarray() _GLIBCXX_NOEXCEPT
{
std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
- std::__valarray_release_memory(_M_data);
+ std::__valarray_release_memory(_M_data, _M_size);
}
template<typename _Tp>
if (_M_data)
{
std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
- std::__valarray_release_memory(_M_data);
+ std::__valarray_release_memory(_M_data, _M_size);
}
_M_size = __v._M_size;
_M_data = __valarray_get_storage<_Tp>(_M_size);
if (_M_data)
{
std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
- std::__valarray_release_memory(_M_data);
+ std::__valarray_release_memory(_M_data, _M_size);
}
_M_size = __v._M_size;
_M_data = __v._M_data;
if (_M_data)
{
std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
- std::__valarray_release_memory(_M_data);
+ std::__valarray_release_memory(_M_data, _M_size);
}
_M_size = __l.size();
_M_data = __valarray_get_storage<_Tp>(_M_size);
if (_M_data)
{
std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
- std::__valarray_release_memory(_M_data);
+ std::__valarray_release_memory(_M_data, _M_size);
}
_M_size = __e.size();
_M_data = __valarray_get_storage<_Tp>(_M_size);
std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
if (_M_size != __n)
{
- std::__valarray_release_memory(_M_data);
+ std::__valarray_release_memory(_M_data, _M_size);
_M_size = __n;
_M_data = __valarray_get_storage<_Tp>(__n);
}
--- /dev/null
+// { dg-do run { target c++11 } }
+// { dg-additional-options "-faligned-new" { target c++14_down } }
+
+#include <valarray>
+#include <cstdint>
+#include <testsuite_hooks.h>
+
+struct alignas(64) Num
+{
+ Num()
+ {
+ VERIFY(reinterpret_cast<std::uintptr_t>(this) % alignof(*this) == 0);
+ }
+
+ double val{};
+};
+
+int main()
+{
+ std::valarray<Num> v(2);
+ v.resize(4, {});
+}