From 9cb494bcc3d6b9baab57158d833f59dccab693b8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 22 May 2020 14:10:08 +0200 Subject: Get rid of now deprecated std::is_pod usage --- libbuild2/function.hxx | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) (limited to 'libbuild2/function.hxx') diff --git a/libbuild2/function.hxx b/libbuild2/function.hxx index b745173..47eee5b 100644 --- a/libbuild2/function.hxx +++ b/libbuild2/function.hxx @@ -124,8 +124,8 @@ namespace build2 // function_impl* const impl; - // Auxiliary data storage. Note that it is assumed to be POD (no - // destructors, bitwise copy, etc). + // Auxiliary data storage. Note that it is expected to be trivially + // copyable and destructible. // std::aligned_storage::type data; static const size_t data_size = sizeof (decltype (data)); @@ -144,14 +144,21 @@ namespace build2 D d) : function_overload (an, mi, ma, move (ts), im) { - // std::is_pod appears to be broken in VC16 and also in GCC up to - // 5 (pointers to members). + static_assert (sizeof (D) <= data_size, "insufficient space for data"); + + // These tests appear to be broken in VC16 and also in GCC up to 5 for + // pointers to members. // -#if !((defined(_MSC_VER) && _MSC_VER < 2000) || \ +#if !((defined(_MSC_VER) && _MSC_VER < 2000) || \ (defined(__GNUC__) && !defined(__clang__) && __GNUC__ <= 5)) - static_assert (std::is_pod::value, "type is not POD"); + + static_assert (std::is_trivially_copyable::value, + "data is not trivially copyable"); + + static_assert (std::is_trivially_destructible::value, + "data is not trivially destructible"); #endif - static_assert (sizeof (D) <= data_size, "insufficient space"); + new (&data) D (move (d)); } }; -- cgit v1.1