diff --git a/.appveyor.yml b/.appveyor.yml index 5e9694007..3d49d56bb 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -3,6 +3,7 @@ image: - Visual Studio 2017 - Visual Studio 2015 test: off +skip_branch_with_pr: true build: parallel: true platform: diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h index ff15a414f..a7b3e3f92 100644 --- a/include/pybind11/cast.h +++ b/include/pybind11/cast.h @@ -574,12 +574,13 @@ public: if (type->operator_new) { vptr = type->operator_new(type->type_size); } else { - #if !defined(PYBIND11_CPP17) - vptr = ::operator new(type->type_size); - #else - vptr = ::operator new(type->type_size, - (std::align_val_t) type->type_align); + #if defined(PYBIND11_CPP17) + if (type->type_align > __STDCPP_DEFAULT_NEW_ALIGNMENT__) + vptr = ::operator new(type->type_size, + (std::align_val_t) type->type_align); + else #endif + vptr = ::operator new(type->type_size); } } value = vptr; diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index 9dd71e4d6..860d1b1c5 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h @@ -988,11 +988,21 @@ template struct has_operator_delete_size::value, int> = 0> -void call_operator_delete(T *p, size_t) { T::operator delete(p); } +void call_operator_delete(T *p, size_t, size_t) { T::operator delete(p); } template ::value && has_operator_delete_size::value, int> = 0> -void call_operator_delete(T *p, size_t s) { T::operator delete(p, s); } +void call_operator_delete(T *p, size_t s, size_t) { T::operator delete(p, s); } -inline void call_operator_delete(void *p, size_t) { ::operator delete(p); } +inline void call_operator_delete(void *p, size_t s, size_t a) { + (void)s; (void)a; +#if defined(PYBIND11_CPP17) + if (a > __STDCPP_DEFAULT_NEW_ALIGNMENT__) + ::operator delete(p, s, std::align_val_t(a)); + else + ::operator delete(p, s); +#else + ::operator delete(p); +#endif +} NAMESPACE_END(detail) @@ -1331,7 +1341,10 @@ private: v_h.set_holder_constructed(false); } else { - detail::call_operator_delete(v_h.value_ptr(), v_h.type->type_size); + detail::call_operator_delete(v_h.value_ptr(), + v_h.type->type_size, + v_h.type->type_align + ); } v_h.value_ptr() = nullptr; }