]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Simplify std::any to fix -Wdeprecated-declarations warning
authorJonathan Wakely <jwakely@redhat.com>
Wed, 28 Aug 2024 12:07:47 +0000 (13:07 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 3 Sep 2024 14:08:44 +0000 (15:08 +0100)
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.

libstdc++-v3/include/experimental/any
libstdc++-v3/include/std/any
libstdc++-v3/testsuite/20_util/any/layout.cc [new file with mode: 0644]

index 27a7a146e53c5484d12ecd2ec8be7051d1e45d9e..3db30df5c75ef3e9c67b8df3551f915419e23cec 100644 (file)
@@ -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>,
index e4709b1ce0468090f4bf8c5dfc7bae21dc3f4bee..9ae29aab99fa93b2dd1bd385e0b9812b809508ca 100644 (file)
@@ -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 (file)
index 0000000..5a7f4a8
--- /dev/null
@@ -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) );