diff mbox series

[committed] libstdc++: Simplify std::any to fix -Wdeprecated-declarations warning

Message ID 20240903140931.2659102-1-jwakely@redhat.com
State New
Headers show
Series [committed] libstdc++: Simplify std::any to fix -Wdeprecated-declarations warning | expand

Commit Message

Jonathan Wakely Sept. 3, 2024, 2:09 p.m. UTC
Tested x86_64-linux. Pushed to trunk.

-- >8 --

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

Patch

diff --git a/libstdc++-v3/include/experimental/any b/libstdc++-v3/include/experimental/any
index 27a7a146e53..3db30df5c75 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 e4709b1ce04..9ae29aab99f 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 00000000000..5a7f4a8a280
--- /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) );