From: Jonathan Wakely Date: Wed, 28 Aug 2024 12:07:47 +0000 (+0100) Subject: libstdc++: Simplify std::any to fix -Wdeprecated-declarations warning X-Git-Tag: basepoints/gcc-16~6134 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dee3c5c6ff9952204af3014383593e8d316250e4;p=thirdparty%2Fgcc.git libstdc++: Simplify std::any to fix -Wdeprecated-declarations warning We don't need to use std::aligned_storage in std::any. We just need a POD type of the right size. The void* union member already ensures the alignment will be correct. Avoiding std::aligned_storage means we don't need to suppress a -Wdeprecated-declarations warning. libstdc++-v3/ChangeLog: * include/experimental/any (experimental::any::_Storage): Use array of unsigned char instead of deprecated std::aligned_storage. * include/std/any (any::_Storage): Likewise. * testsuite/20_util/any/layout.cc: New test. --- diff --git a/libstdc++-v3/include/experimental/any b/libstdc++-v3/include/experimental/any index 27a7a146e53c..3db30df5c75e 100644 --- a/libstdc++-v3/include/experimental/any +++ b/libstdc++-v3/include/experimental/any @@ -102,7 +102,7 @@ inline namespace fundamentals_v1 _Storage& operator=(const _Storage&) = delete; void* _M_ptr; - aligned_storage::type _M_buffer; + unsigned char _M_buffer[sizeof(_M_ptr)]; }; template, diff --git a/libstdc++-v3/include/std/any b/libstdc++-v3/include/std/any index e4709b1ce046..9ae29aab99fa 100644 --- a/libstdc++-v3/include/std/any +++ b/libstdc++-v3/include/std/any @@ -90,7 +90,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _Storage& operator=(const _Storage&) = delete; void* _M_ptr; - aligned_storage::type _M_buffer; + unsigned char _M_buffer[sizeof(_M_ptr)]; }; template, diff --git a/libstdc++-v3/testsuite/20_util/any/layout.cc b/libstdc++-v3/testsuite/20_util/any/layout.cc new file mode 100644 index 000000000000..5a7f4a8a280f --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/any/layout.cc @@ -0,0 +1,22 @@ +// { dg-options "-Wno-deprecated-declarations" } +// { dg-do compile { target c++17 } } + +// Verify that r15-3419 did not change the layout of std::any + +#include + +namespace test { + class any { + union Storage { + constexpr Storage() : ptr(nullptr) { } + void* ptr; + std::aligned_storage::type buffer; + }; + + void (*manager)(int, const any*, void*); + Storage storage; + }; +} + +static_assert( sizeof(std::any) == sizeof(test::any) ); +static_assert( alignof(std::any) == alignof(test::any) );