https://gcc.gnu.org/g:dee3c5c6ff9952204af3014383593e8d316250e4

commit r15-3419-gdee3c5c6ff9952204af3014383593e8d316250e4
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Wed Aug 28 13:07:47 2024 +0100

    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:
---
 libstdc++-v3/include/experimental/any        |  2 +-
 libstdc++-v3/include/std/any                 |  2 +-
 libstdc++-v3/testsuite/20_util/any/layout.cc | 22 ++++++++++++++++++++++
 3 files changed, 24 insertions(+), 2 deletions(-)

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<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>,
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<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>,
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 <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) );

Reply via email to