[gdb/build, c++20] Handle deprecated std::allocator::construct
authorTom de Vries <tdevries@suse.de>
Thu, 17 Aug 2023 08:41:34 +0000 (10:41 +0200)
committerTom de Vries <tdevries@suse.de>
Thu, 17 Aug 2023 08:41:34 +0000 (10:41 +0200)
When building gdb with -std=c++20, I run into:
...
gdbsupport/default-init-alloc.h:52:12: error: ‘construct’ has not been \
  declared in ‘class std::allocator<unsigned char>’
   52 |   using A::construct;
      |            ^~~~~~~~~
...

Indeed, std::allocator::construct has been deprecated in c++17 and removed in
c++20.

Fix this by using instead std::pmr::polymorphic_allocator for c++20.

Tested on x86_64-linux.

gdbsupport/default-init-alloc.h

index 9c8b5a2c689340a7006eab11085ef803dbc4884d..e2d3bd2451675fbf1d182f1604a9dff193f1a752 100644 (file)
 #ifndef COMMON_DEFAULT_INIT_ALLOC_H
 #define COMMON_DEFAULT_INIT_ALLOC_H
 
+#if __cplusplus >= 202002L
+#include <memory_resource>
+#endif
+
 namespace gdb {
 
 /* An allocator that default constructs using default-initialization
@@ -29,7 +33,14 @@ namespace gdb {
    adapter that given an allocator A, overrides 'A::construct()'.  'A'
    defaults to std::allocator<T>.  */
 
-template<typename T, typename A = std::allocator<T>>
+template<typename T,
+        typename A
+#if __cplusplus >= 202002L
+        = std::pmr::polymorphic_allocator<T>
+#else
+        = std::allocator<T>
+#endif
+        >
 class default_init_allocator : public A
 {
 public: