On 28/08/24 15:40, Jonathan Wakely wrote:
External email: Use caution opening links or attachments


On Wed, 28 Aug 2024 at 06:47, Dhruv Chawla <dhr...@nvidia.com> wrote:

version.syn#2 requires <string> to define
__cpp_lib_allocator_traits_is_always_equal.

The attached patch therefore defines the
__glibcxx_want_allocator_traits_is_always_equal macro to get the
definition of the feature-test macro from <bits/version.h>.

This is not isolated only to <string> though. The standard requires the
following (as per version.syn#2):

#define __cpp_lib_allocator_traits_is_always_equal  201411L
    // freestanding, also in <memory>, <scoped_allocator>, <string>, <deque>,
    // <forward_list>, <list>, <vector>, <map>, <set>, <unordered_map>,
    // <unordered_set>

After fixing <string>, all the above headers except <memory> still fail to
define the macro. Should similar fixes be created for these headers as well?

Yes please, this is a regression since GCC 13. It was previously
defined in <bits/alloc_traits.h> which is included by all the headers
above. In GCC 14 we changed how we define feature test macros, and we
accidentally stopped defining it in all those headers.


I have updated the headers now, please have a look.

Bootstrapped and regtested on aarch64-linux-gnu.


Signed-off-by: Dhruv Chawla <dhr...@nvidia.com>

--
Regards,
Dhruv


--
Regards,
Dhruv
From 20ed439aab6532c0d8c66772df0341a4c8c7af4b Mon Sep 17 00:00:00 2001
From: Dhruv Chawla <dhr...@nvidia.com>
Date: Mon, 26 Aug 2024 11:09:19 +0530
Subject: [PATCH] libstdc++: Add missing feature-test macro in various headers

version.syn#2 requires various headers to define
__cpp_lib_allocator_traits_is_always_equal. Currently, only <memory> was
defining this macro. Implement fixes for the other headers as well.

Signed-off-by: Dhruv Chawla <dhr...@nvidia.com>

libstdc++-v3/ChangeLog:

        * include/std/deque: Define macro
        __glibcxx_want_allocator_traits_is_always_equal.
        * include/std/forward_list: Likewise.
        * include/std/list: Likewise.
        * include/std/map: Likewise.
        * include/std/scoped_allocator: Likewise.
        * include/std/set: Likewise.
        * include/std/string: Likewise.
        * include/std/unordered_map: Likewise.
        * include/std/unordered_set: Likewise.
        * include/std/vector: Likewise.
        * testsuite/20_util/headers/memory/version.cc: New test.
        * testsuite/20_util/scoped_allocator/version.cc: Likewise.
        * testsuite/21_strings/headers/string/version.cc: Likewise.
        * testsuite/23_containers/deque/version.cc: Likewise.
        * testsuite/23_containers/forward_list/version.cc: Likewise.
        * testsuite/23_containers/list/version.cc: Likewise.
        * testsuite/23_containers/map/version.cc: Likewise.
        * testsuite/23_containers/set/version.cc: Likewise.
        * testsuite/23_containers/unordered_map/version.cc: Likewise.
        * testsuite/23_containers/unordered_set/version.cc: Likewise.
        * testsuite/23_containers/vector/version.cc: Likewise.
---
 libstdc++-v3/include/std/deque                            | 1 +
 libstdc++-v3/include/std/forward_list                     | 1 +
 libstdc++-v3/include/std/list                             | 1 +
 libstdc++-v3/include/std/map                              | 1 +
 libstdc++-v3/include/std/scoped_allocator                 | 3 +++
 libstdc++-v3/include/std/set                              | 1 +
 libstdc++-v3/include/std/string                           | 1 +
 libstdc++-v3/include/std/unordered_map                    | 1 +
 libstdc++-v3/include/std/unordered_set                    | 1 +
 libstdc++-v3/include/std/vector                           | 1 +
 libstdc++-v3/testsuite/20_util/headers/memory/version.cc  | 8 ++++++++
 .../testsuite/20_util/scoped_allocator/version.cc         | 8 ++++++++
 .../testsuite/21_strings/headers/string/version.cc        | 8 ++++++++
 libstdc++-v3/testsuite/23_containers/deque/version.cc     | 8 ++++++++
 .../testsuite/23_containers/forward_list/version.cc       | 8 ++++++++
 libstdc++-v3/testsuite/23_containers/list/version.cc      | 8 ++++++++
 libstdc++-v3/testsuite/23_containers/map/version.cc       | 8 ++++++++
 libstdc++-v3/testsuite/23_containers/set/version.cc       | 8 ++++++++
 .../testsuite/23_containers/unordered_map/version.cc      | 8 ++++++++
 .../testsuite/23_containers/unordered_set/version.cc      | 8 ++++++++
 libstdc++-v3/testsuite/23_containers/vector/version.cc    | 8 ++++++++
 21 files changed, 100 insertions(+)
 create mode 100644 libstdc++-v3/testsuite/20_util/headers/memory/version.cc
 create mode 100644 libstdc++-v3/testsuite/20_util/scoped_allocator/version.cc
 create mode 100644 libstdc++-v3/testsuite/21_strings/headers/string/version.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/deque/version.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/forward_list/version.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/list/version.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/map/version.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/set/version.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/unordered_map/version.cc
 create mode 100644 
libstdc++-v3/testsuite/23_containers/unordered_set/version.cc
 create mode 100644 libstdc++-v3/testsuite/23_containers/vector/version.cc

diff --git a/libstdc++-v3/include/std/deque b/libstdc++-v3/include/std/deque
index 0bf8309c19a..69f8c0dcdcc 100644
--- a/libstdc++-v3/include/std/deque
+++ b/libstdc++-v3/include/std/deque
@@ -68,6 +68,7 @@
 #include <bits/range_access.h>
 #include <bits/deque.tcc>
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_nonmember_container_access
 #include <bits/version.h>
diff --git a/libstdc++-v3/include/std/forward_list 
b/libstdc++-v3/include/std/forward_list
index 5ac74360808..dfd7d48d121 100644
--- a/libstdc++-v3/include/std/forward_list
+++ b/libstdc++-v3/include/std/forward_list
@@ -45,6 +45,7 @@
 # include <debug/forward_list>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_incomplete_container_elements
 #define __glibcxx_want_list_remove_return_type
diff --git a/libstdc++-v3/include/std/list b/libstdc++-v3/include/std/list
index fce4e3d925b..ff632fc1ab2 100644
--- a/libstdc++-v3/include/std/list
+++ b/libstdc++-v3/include/std/list
@@ -69,6 +69,7 @@
 # include <debug/list>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_incomplete_container_elements
 #define __glibcxx_want_list_remove_return_type
diff --git a/libstdc++-v3/include/std/map b/libstdc++-v3/include/std/map
index 4a96e59a5bc..6520d9f744f 100644
--- a/libstdc++-v3/include/std/map
+++ b/libstdc++-v3/include/std/map
@@ -69,6 +69,7 @@
 # include <debug/map>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_generic_associative_lookup
 #define __glibcxx_want_map_try_emplace
diff --git a/libstdc++-v3/include/std/scoped_allocator 
b/libstdc++-v3/include/std/scoped_allocator
index dbe7bf3cbf6..532a44691ba 100644
--- a/libstdc++-v3/include/std/scoped_allocator
+++ b/libstdc++-v3/include/std/scoped_allocator
@@ -43,6 +43,9 @@
 # include <bits/uses_allocator_args.h>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
+#include <bits/version.h>
+
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
diff --git a/libstdc++-v3/include/std/set b/libstdc++-v3/include/std/set
index bf2474c7eb2..95cc8005a19 100644
--- a/libstdc++-v3/include/std/set
+++ b/libstdc++-v3/include/std/set
@@ -69,6 +69,7 @@
 # include <debug/set>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_generic_associative_lookup
 #define __glibcxx_want_node_extract
diff --git a/libstdc++-v3/include/std/string b/libstdc++-v3/include/std/string
index 55144409cca..8db0802a282 100644
--- a/libstdc++-v3/include/std/string
+++ b/libstdc++-v3/include/std/string
@@ -54,6 +54,7 @@
 #include <bits/basic_string.h>
 #include <bits/basic_string.tcc>
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_constexpr_char_traits
 #define __glibcxx_want_constexpr_string
 #define __glibcxx_want_erase_if
diff --git a/libstdc++-v3/include/std/unordered_map 
b/libstdc++-v3/include/std/unordered_map
index ea6129d6494..f9a948c3873 100644
--- a/libstdc++-v3/include/std/unordered_map
+++ b/libstdc++-v3/include/std/unordered_map
@@ -46,6 +46,7 @@
 # include <debug/unordered_map>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_generic_unordered_lookup
 #define __glibcxx_want_node_extract
diff --git a/libstdc++-v3/include/std/unordered_set 
b/libstdc++-v3/include/std/unordered_set
index a48fe0cd563..aa5b702ff4d 100644
--- a/libstdc++-v3/include/std/unordered_set
+++ b/libstdc++-v3/include/std/unordered_set
@@ -46,6 +46,7 @@
 # include <debug/unordered_set>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_generic_unordered_lookup
 #define __glibcxx_want_node_extract
diff --git a/libstdc++-v3/include/std/vector b/libstdc++-v3/include/std/vector
index a1f7ef86824..906c1627935 100644
--- a/libstdc++-v3/include/std/vector
+++ b/libstdc++-v3/include/std/vector
@@ -76,6 +76,7 @@
 # include <debug/vector>
 #endif
 
+#define __glibcxx_want_allocator_traits_is_always_equal
 #define __glibcxx_want_constexpr_vector
 #define __glibcxx_want_erase_if
 #define __glibcxx_want_incomplete_container_elements
diff --git a/libstdc++-v3/testsuite/20_util/headers/memory/version.cc 
b/libstdc++-v3/testsuite/20_util/headers/memory/version.cc
new file mode 100644
index 00000000000..c82c9a018e0
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/headers/memory/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <memory>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/20_util/scoped_allocator/version.cc 
b/libstdc++-v3/testsuite/20_util/scoped_allocator/version.cc
new file mode 100644
index 00000000000..c5a1b11a739
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/scoped_allocator/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <scoped_allocator>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/21_strings/headers/string/version.cc 
b/libstdc++-v3/testsuite/21_strings/headers/string/version.cc
new file mode 100644
index 00000000000..a546b75b3fe
--- /dev/null
+++ b/libstdc++-v3/testsuite/21_strings/headers/string/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <string>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/deque/version.cc 
b/libstdc++-v3/testsuite/23_containers/deque/version.cc
new file mode 100644
index 00000000000..09d71cb935d
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/deque/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <deque>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/forward_list/version.cc 
b/libstdc++-v3/testsuite/23_containers/forward_list/version.cc
new file mode 100644
index 00000000000..7a0203978f0
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/forward_list/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <forward_list>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/list/version.cc 
b/libstdc++-v3/testsuite/23_containers/list/version.cc
new file mode 100644
index 00000000000..3ac63e06d90
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/list/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <list>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/map/version.cc 
b/libstdc++-v3/testsuite/23_containers/map/version.cc
new file mode 100644
index 00000000000..31a228d365d
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/map/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <map>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/set/version.cc 
b/libstdc++-v3/testsuite/23_containers/set/version.cc
new file mode 100644
index 00000000000..eb49b2353c3
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/set/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <set>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_map/version.cc 
b/libstdc++-v3/testsuite/23_containers/unordered_map/version.cc
new file mode 100644
index 00000000000..946d7c295d5
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/unordered_map/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <unordered_map>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/version.cc 
b/libstdc++-v3/testsuite/23_containers/unordered_set/version.cc
new file mode 100644
index 00000000000..d22adfb420e
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/unordered_set/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <unordered_set>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
diff --git a/libstdc++-v3/testsuite/23_containers/vector/version.cc 
b/libstdc++-v3/testsuite/23_containers/vector/version.cc
new file mode 100644
index 00000000000..0c8e4150abc
--- /dev/null
+++ b/libstdc++-v3/testsuite/23_containers/vector/version.cc
@@ -0,0 +1,8 @@
+// { dg-do preprocess { target c++17 } }
+// { dg-add-options no_pch }
+
+#include <vector>
+
+#if __cpp_lib_allocator_traits_is_always_equal != 201411L
+# error "Feature-test macro __cpp_lib_allocator_traits_is_always_equal has 
wrong value in <version>"
+#endif
-- 
2.25.1

Reply via email to