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.
This commit is contained in:
parent
efe6efb6f3
commit
dee3c5c6ff
3 changed files with 24 additions and 2 deletions
|
@ -102,7 +102,7 @@ inline namespace fundamentals_v1
|
|||
_Storage& operator=(const _Storage&) = delete;
|
||||
|
||||
void* _M_ptr;
|
||||
aligned_storage<sizeof(_M_ptr), alignof(void*)>::type _M_buffer;
|
||||
unsigned char _M_buffer[sizeof(_M_ptr)];
|
||||
};
|
||||
|
||||
template<typename _Tp, typename _Safe = is_nothrow_move_constructible<_Tp>,
|
||||
|
|
|
@ -90,7 +90,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
|||
_Storage& operator=(const _Storage&) = delete;
|
||||
|
||||
void* _M_ptr;
|
||||
aligned_storage<sizeof(_M_ptr), alignof(void*)>::type _M_buffer;
|
||||
unsigned char _M_buffer[sizeof(_M_ptr)];
|
||||
};
|
||||
|
||||
template<typename _Tp, typename _Safe = is_nothrow_move_constructible<_Tp>,
|
||||
|
|
22
libstdc++-v3/testsuite/20_util/any/layout.cc
Normal file
22
libstdc++-v3/testsuite/20_util/any/layout.cc
Normal file
|
@ -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 <any>
|
||||
|
||||
namespace test {
|
||||
class any {
|
||||
union Storage {
|
||||
constexpr Storage() : ptr(nullptr) { }
|
||||
void* ptr;
|
||||
std::aligned_storage<sizeof(ptr), alignof(void*)>::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) );
|
Loading…
Add table
Reference in a new issue