public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] C++ API database
@ 2022-09-12 11:51 Ulrich Drepper
  2022-09-28 16:59 ` Ulrich Drepper
  0 siblings, 1 reply; 6+ messages in thread
From: Ulrich Drepper @ 2022-09-12 11:51 UTC (permalink / raw)
  To: gcc-patches


[-- Attachment #1.1: Type: text/plain, Size: 3503 bytes --]

After my prior inquiry into the use of python as a build tool for
maintainers didn't produce any negative comments and several active and
even enthusiastic support message I'm going forward with submitting the
patch.

To repeat the detail, for the generation of the upcoming C++ standard
library module and the hints for missing definitions/declarations in the
std:: namespace we need a list of standard C++ APIs.  The information
needed for the two use cases is different but the actual APIs overlap
almost completely and therefore it would be a bad idea to have the data
separated.

We could opt for a file format that is easy to read in awk and writing the
appropriate scripts to transform the data into the appropriate output
format but this looks ugly, is hard to understand, and a nightmare to
maintain.  On the other hand, writing the code in Python is simple and
clean.


Therefore, Jonathan and I worked on a CSV file which contains the necessary
information and a Python to create the gperf input file to generate
std-name-hint.h and also, in future, the complete source of the export
interface description for the standard library module.  This mode is not
yet used because the module support isn't ready yet.  The output file
corresponds to the hand-coded version of the export code Jonathan uses
right now.

Note that in both of these cases the generated files are static, they don't
depend on the local configuration and therefore are checked into the source
code repository.  The script only has to run if the generated files are
explicitly removed or, in maintainer mode, if the CSV file has changed.
For normal compilation from a healthy source code tree the tool is not
needed.


One remaining issue is the responsibility for the CSV file.  The file needs
to live in the directory of the frontend and therefore nominally changes
need to be approved by the frontend maintainers.  The content entirely
consists of information from the standard library, though.  Any change that
doesn't break the build on one machine (i.e., the Python script doesn't
fail) will not course any problem because the output format of the script
is correct.  Therefore we have been wondering whether the CSV file should
at least have shared ownership between the frontend maintainers and the
libstdc++ maintainers.

The CSV file contain more hint information than the old hand-coded .gperf
file.  So, an additional effect of this patch is the extension of the hints
that are provided but given that the lookup is now fast this shouldn't have
any negative impact.  The file is not complete, though, this will come over
time and definitely before the module support is done.

I build my complete set of compilers with this patch without problems.

Any comments?

2022-09-12  Jonathan Wakely  <jwakely@redhat.com>
            Ulrich Drepper  <drepper@redhat.com>

contrib/ChangeLog
        * gcc_update: Add rule to generate gcc/cp/std-name-hint.gperf.

gcc/cp/ChangeLog
        * Make-lang.in: Add rule to generate gcc/cp/std-name-hint.gperf.
        Adjust rule to generate $(srcdir)/cp/std-name-hint.h.
        Add explicit rule to depend cp/name-lookup.o on
        $(srcdir)/cp/std-name-hint.h.
        * cxxapi-data.csv: New file.  Database of C++ APIs.
        * gen-cxxapi-file.py: New file.  Script to generate source code for
        C++ standard library exports and to generate C++ std:: namespace
        fix hints.
        * std-name-hint.gperf: Regenerated.
        * std-name-hint.h: Regenerated.

[-- Attachment #2: d-gcc-cxxabi-csv --]
[-- Type: application/octet-stream, Size: 119081 bytes --]

diff --git a/contrib/gcc_update b/contrib/gcc_update
index dd8b6d0b6bf..18c7ec46264 100755
--- a/contrib/gcc_update
+++ b/contrib/gcc_update
@@ -95,6 +95,7 @@ gcc/config/rs6000/fusion.md: gcc/config/rs6000/genfusion.pl
 # And then, language-specific files
 gcc/cp/cfns.h: gcc/cp/cfns.gperf
 gcc/cp/std-name-hint.h: gcc/cp/std-name-hint.gperf
+gcc/cp/std-name-hint.gperf: gcc/cp/cxxapi-data.csv
 # testsuite
 # Without this, _Pragma3.c can have a false negative.
 gcc/testsuite/gcc.dg/cpp/_Pragma3.c: gcc/testsuite/gcc.dg/cpp/mi1c.h
diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in
index 38d8eeed1f0..c54f32336a9 100644
--- a/gcc/cp/Make-lang.in
+++ b/gcc/cp/Make-lang.in
@@ -153,15 +153,23 @@ endif
 	gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L C++ \
 		$(srcdir)/cp/cfns.gperf --output-file $(srcdir)/cp/cfns.h
 
-# The same procedure for the std-name-hint.gperf file.
-ifeq ($(ENABLE_MAINTAINER_RULES), true)
+# We always need the dependency on the .gperf file because it itself is generated.
 $(srcdir)/cp/std-name-hint.h: $(srcdir)/cp/std-name-hint.gperf
-else
-$(srcdir)/cp/std-name-hint.h:
-endif
 	gperf -o -C -E -k '1,2,7,11,$$' -D -N find -L C++ \
 		$(srcdir)/cp/std-name-hint.gperf --output-file $(srcdir)/cp/std-name-hint.h
 
+# The std-name-hint.gperf file itself is generated from a general
+# C++ API description.
+ifeq ($(ENABLE_MAINTAINER_RULES), true)
+$(srcdir)/cp/std-name-hint.gperf: $(srcdir)/cp/gen-cxxapi-file.py $(srcdir)/cp/cxxapi-data.csv
+else
+$(srcdir)/cp/std-name-hint.gperf:
+endif
+	python3 $(srcdir)/cp/gen-cxxapi-file.py hints $(srcdir)/cp/cxxapi-data.csv > $@
+
+# This is the file that depends in the generated header file.
+cp/name-lookup.o: $(srcdir)/cp/std-name-hint.h
+
 cc1plus.fda: ../stage1-gcc/cc1plus$(exeext) ../prev-gcc/$(PERF_DATA)
 	$(CREATE_GCOV) -binary ../stage1-gcc/cc1plus$(exeext) -gcov cc1plus.fda -profile ../prev-gcc/$(PERF_DATA) -gcov_version 1
 
diff --git a/gcc/cp/std-name-hint.gperf b/gcc/cp/std-name-hint.gperf
index 976b90c3391..ebb049a06ba 100644
--- a/gcc/cp/std-name-hint.gperf
+++ b/gcc/cp/std-name-hint.gperf
@@ -2,6 +2,7 @@
 %define class-name std_name_hint_lookup
 %struct-type
 %{
+/* This file is auto-generated by /home/drepper/gnu/gcc/gcc/cp/gen-cxxapi-file.py.  */
 /* Copyright (C) 2022 Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -47,33 +48,55 @@ array, "<array>", cxx11
 to_array, "<array>", cxx20
 # <atomic>
 atomic, "<atomic>", cxx11
-atomic_flag, "<atomic>", cxx11
 atomic_ref, "<atomic>", cxx20
+atomic_signed_lock_free, "<atomic>", cxx11
+atomic_uintmax_t, "<atomic>", cxx20
+atomic_unsigned_lock_free, "<atomic>", cxx11
 # <bitset>
 bitset, "<bitset>", cxx11
 # <compare>
-weak_equality, "<compare>", cxx20
-strong_equality, "<compare>", cxx20
 partial_ordering, "<compare>", cxx20
-weak_ordering, "<compare>", cxx20
+strong_equality, "<compare>", cxx20
 strong_ordering, "<compare>", cxx20
+weak_equality, "<compare>", cxx20
+weak_ordering, "<compare>", cxx20
 # <complex>
 complex, "<complex>", cxx98
 complex_literals, "<complex>", cxx14
-# <condition_variable>. */
+# <condition_variable>
 condition_variable, "<condition_variable>", cxx11
 condition_variable_any, "<condition_variable>", cxx11
 # <cstddef>
 byte, "<cstddef>", cxx17
+# <cstdint>
+uint_fast16_t, "<cstdint>", cxx11
+uint_fast32_t, "<cstdint>", cxx11
+uint_fast64_t, "<cstdint>", cxx11
+uint_fast8_t, "<cstdint>", cxx11
+uint_least16_t, "<cstdint>", cxx11
+uint_least32_t, "<cstdint>", cxx11
+uint_least64_t, "<cstdint>", cxx11
+uint_least8_t, "<cstdint>", cxx11
+uintmax_t, "<cstdint>", cxx11
+uintptr_t, "<cstdint>", cxx11
 # <deque>
 deque, "<deque>", cxx98
+# <exception>
+current_exception, "<exception>", cxx11
+exception, "<exception>", cxx98
+exception_ptr, "<exception>", cxx11
+make_exception_ptr, "<exception>", cxx11
+terminate, "<exception>", cxx98
+uncaught_exceptions, "<exception>", cxx17
+# <expected>
+expected, "<expected>", cxx23
 # <forward_list>
 forward_list, "<forward_list>", cxx11
 # <fstream>
 basic_filebuf, "<fstream>", cxx98
+basic_fstream, "<fstream>", cxx98
 basic_ifstream, "<fstream>", cxx98
 basic_ofstream, "<fstream>", cxx98
-basic_fstream, "<fstream>", cxx98
 fstream, "<fstream>", cxx98
 ifstream, "<fstream>", cxx98
 ofstream, "<fstream>", cxx98
@@ -83,63 +106,65 @@ bind_front, "<functional>", cxx20
 function, "<functional>", cxx11
 hash, "<functional>", cxx11
 invoke, "<functional>", cxx17
+invoke_r, "<functional>", cxx23
 mem_fn, "<functional>", cxx11
 not_fn, "<functional>", cxx17
 reference_wrapper, "<functional>", cxx11
-unwrap_reference, "<functional>", cxx20
-unwrap_reference_t, "<functional>", cxx20
 unwrap_ref_decay, "<functional>", cxx20
 unwrap_ref_decay_t, "<functional>", cxx20
-# <future>. */
+unwrap_reference, "<functional>", cxx20
+unwrap_reference_t, "<functional>", cxx20
+# <future>
 async, "<future>", cxx11
 future, "<future>", cxx11
 packaged_task, "<future>", cxx11
 promise, "<future>", cxx11
 # <iomanip>
+get_money, "<iomanip>", cxx11
+get_time, "<iomanip>", cxx11
+put_money, "<iomanip>", cxx11
+put_time, "<iomanip>", cxx11
+quoted, "<iomanip>", cxx14
 resetiosflags, "<iomanip>", cxx98
-setiosflags, "<iomanip>", cxx98
 setbase, "<iomanip>", cxx98
 setfill, "<iomanip>", cxx98
+setiosflags, "<iomanip>", cxx98
 setprecision, "<iomanip>", cxx98
 setw, "<iomanip>", cxx98
-get_money, "<iomanip>", cxx11
-put_money, "<iomanip>", cxx11
-get_time, "<iomanip>", cxx11
-put_time, "<iomanip>", cxx11
-quoted, "<iomanip>", cxx14
 # <ios>
 boolalpha, "<ios>", cxx98
+dec, "<ios>", cxx98
+defaultfloat, "<ios>", cxx11
+fixed, "<ios>", cxx98
+hex, "<ios>", cxx98
+hexfloat, "<ios>", cxx11
+internal, "<ios>", cxx98
+left, "<ios>", cxx98
 noboolalpha, "<ios>", cxx98
-showbase, "<ios>", cxx98
 noshowbase, "<ios>", cxx98
-showpoint, "<ios>", cxx98
 noshowpoint, "<ios>", cxx98
-showpos, "<ios>", cxx98
 noshowpos, "<ios>", cxx98
-skipws, "<ios>", cxx98
 noskipws, "<ios>", cxx98
-uppercase, "<ios>", cxx98
-nouppercase, "<ios>", cxx98
-unitbuf, "<ios>", cxx98
 nounitbuf, "<ios>", cxx98
-internal, "<ios>", cxx98
-left, "<ios>", cxx98
-right, "<ios>", cxx98
-dec, "<ios>", cxx98
-hex, "<ios>", cxx98
+nouppercase, "<ios>", cxx98
 oct, "<ios>", cxx98
-fixed, "<ios>", cxx98
+right, "<ios>", cxx98
 scientific, "<ios>", cxx98
-hexfloat, "<ios>", cxx11
-defaultfloat, "<ios>", cxx11
+showbase, "<ios>", cxx98
+showpoint, "<ios>", cxx98
+showpos, "<ios>", cxx98
+skipws, "<ios>", cxx98
+unitbuf, "<ios>", cxx98
+uppercase, "<ios>", cxx98
 # <iostream>
-cin, "<iostream>", cxx98
-cout, "<iostream>", cxx98
 cerr, "<iostream>", cxx98
+cin, "<iostream>", cxx98
 clog, "<iostream>", cxx98
+cout, "<iostream>", cxx98
+wcerr, "<iostream>", cxx98
 wcin, "<iostream>", cxx98
-wcout, "<iostream>", cxx98
 wclog, "<iostream>", cxx98
+wcout, "<iostream>", cxx98
 # <istream>
 istream, "<istream>", cxx98
 ws, "<istream>", cxx98
@@ -160,86 +185,213 @@ ostream_iterator, "<iterator>", cxx98
 ostreambuf_iterator, "<iterator>", cxx98
 prev, "<iterator>", cxx11
 reverse_iterator, "<iterator>", cxx98
-# <ostream>
-ostream, "<ostream>", cxx98
-ends, "<ostream>", cxx98
-flush, "<ostream>", cxx98
-endl, "<ostream>", cxx98
-emit_on_flush, "<ostream>", cxx20
-noemit_on_flush, "<ostream>", cxx20
-flush_emit, "<ostream>", cxx20
 # <list>
 list, "<list>", cxx98
 # <map>
 map, "<map>", cxx98
 multimap, "<map>", cxx98
 # <memory>
+addressof, "<memory>", cxx11
+align, "<memory>", cxx11
 allocate_shared, "<memory>", cxx11
+allocate_shared_for_overwrite, "<memory>", cxx20
 allocator, "<memory>", cxx98
+allocator_arg, "<memory>", cxx11
+allocator_arg_t, "<memory>", cxx11
 allocator_traits, "<memory>", cxx11
+assume_aligned, "<memory>", cxx20
+bad_weak_ptr, "<memory>", cxx11
+const_pointer_cast, "<memory>", cxx11
+construct_at, "<memory>", cxx20
+default_delete, "<memory>", cxx11
+destroy, "<memory>", cxx20
+destroy_at, "<memory>", cxx20
+destroy_n, "<memory>", cxx20
+dynamic_pointer_cast, "<memory>", cxx11
+enable_shared_from_this, "<memory>", cxx11
+get_deleter, "<memory>", cxx11
+make_obj_using_allocator, "<memory>", cxx20
 make_shared, "<memory>", cxx11
+make_shared_for_overwrite, "<memory>", cxx20
 make_unique, "<memory>", cxx14
+make_unique_for_overwrite, "<memory>", cxx20
+owner_less, "<memory>", cxx11
+pointer_traits, "<memory>", cxx11
+reinterpret_pointer_cast, "<memory>", cxx17
 shared_ptr, "<memory>", cxx11
+static_pointer_cast, "<memory>", cxx11
+to_address, "<memory>", cxx11
+uninitialized_construct_using_allocator, "<memory>", cxx20
 unique_ptr, "<memory>", cxx11
+uses_allocator, "<memory>", cxx11
+uses_allocator_construction_args, "<memory>", cxx20
+uses_allocator_v, "<memory>", cxx17
 weak_ptr, "<memory>", cxx11
 # <memory_resource>
 pmr, "<memory_resource>", cxx17
+pmr::get_default_resource, "<memory_resource>", cxx17
+pmr::memory_resource, "<memory_resource>", cxx17
+pmr::monotonic_buffer_resource, "<memory_resource>", cxx17
+pmr::new_delete_resource, "<memory_resource>", cxx17
+pmr::polymorphic_allocator, "<memory_resource>", cxx17
+pmr::pool_options, "<memory_resource>", cxx17
+pmr::set_default_resource, "<memory_resource>", cxx17
+pmr::synchronized_pool_resource, "<memory_resource>", cxx17
+pmr::unsynchronized_pool_resource, "<memory_resource>", cxx17
 # <mutex>
+call_once, "<mutex>", cxx11
+lock, "<mutex>", cxx11
+lock_guard, "<mutex>", cxx11
 mutex, "<mutex>", cxx11
-timed_mutex, "<mutex>", cxx11
+once_flag, "<mutex>", cxx11
 recursive_mutex, "<mutex>", cxx11
 recursive_timed_mutex, "<mutex>", cxx11
-once_flag, "<mutex>", cxx11
-call_once, "<mutex>", cxx11
-lock, "<mutex>", cxx11
 scoped_lock, "<mutex>", cxx17
+timed_mutex, "<mutex>", cxx11
 try_lock, "<mutex>", cxx11
-lock_guard, "<mutex>", cxx11
 unique_lock, "<mutex>", cxx11
-# <optional>. */
-optional, "<optional>", cxx17
+# <new>
+bad_alloc, "<new>", cxx98
+hardware_constructive_interference_size, "<new>", cxx17
+hardware_destructive_interference_size, "<new>", cxx17
+launder, "<new>", cxx17
+nothrow, "<new>", cxx98
+nothrow_t, "<new>", cxx98
+# <numbers>
+numbers::e_v, "<numbers>", cxx20
+numbers::egamma_v, "<numbers>", cxx20
+numbers::inv_pi_v, "<numbers>", cxx20
+numbers::inv_sqrt3_v, "<numbers>", cxx20
+numbers::inv_sqrtpi_v, "<numbers>", cxx20
+numbers::ln10_v, "<numbers>", cxx20
+numbers::ln2_v, "<numbers>", cxx20
+numbers::log10e_v, "<numbers>", cxx20
+numbers::log2e_v, "<numbers>", cxx20
+numbers::phi_v, "<numbers>", cxx20
+numbers::pi_v, "<numbers>", cxx20
+numbers::sqrt2_v, "<numbers>", cxx20
+numbers::sqrt3_v, "<numbers>", cxx20
+# <optional>
 make_optional, "<optional>", cxx17
+nullopt, "<optional>", cxx17
+optional, "<optional>", cxx17
 # <ostream>
-ostream, "<ostream>", cxx98
-wostream, "<ostream>", cxx98
+emit_on_flush, "<ostream>", cxx20
+endl, "<ostream>", cxx98
 ends, "<ostream>", cxx98
 flush, "<ostream>", cxx98
-endl, "<ostream>", cxx98
+flush_emit, "<ostream>", cxx20
+noemit_on_flush, "<ostream>", cxx20
+ostream, "<ostream>", cxx98
+wostream, "<ostream>", cxx98
 # <queue>
-queue, "<queue>", cxx98
 priority_queue, "<queue>", cxx98
+queue, "<queue>", cxx98
+# <ranges>
+ranges::enable_borrowed_range, "<ranges>", cxx20
+ranges::enable_view, "<ranges>", cxx20
+# <scoped_allocator>
+scoped_allocator_adaptor, "<scoped_allocator>", cxx11
+# <semaphore>
+binary_semaphore, "<semaphore>", cxx20
+counting_semaphore, "<semaphore>", cxx20
 # <set>
-set, "<set>", cxx98
 multiset, "<set>", cxx98
+set, "<set>", cxx98
 # <shared_mutex>
 shared_lock, "<shared_mutex>", cxx14
 shared_mutex, "<shared_mutex>", cxx17
 shared_timed_mutex, "<shared_mutex>", cxx14
 # <source_location>
 source_location, "<source_location>", cxx20
+# <span>
+span, "<span>", cxx20
+# <spanstream>
+basic_ispanstream, "<spanstream>", cxx23
+basic_ospanstream, "<spanstream>", cxx23
+basic_spanbuf, "<spanstream>", cxx23
+basic_spanstream, "<spanstream>", cxx23
+ispanstream, "<spanstream>", cxx23
+ispanstream, "<spanstream>", cxx23
+ospanstream, "<spanstream>", cxx23
+spanbuf, "<spanstream>", cxx23
+spanstream, "<spanstream>", cxx23
+wispanstream, "<spanstream>", cxx23
+wospanstream, "<spanstream>", cxx23
+wspanbuf, "<spanstream>", cxx23
 # <sstream>
-basic_stringbuf, "<sstream>", cxx98
 basic_istringstream, "<sstream>", cxx98
 basic_ostringstream, "<sstream>", cxx98
+basic_stringbuf, "<sstream>", cxx98
 basic_stringstream, "<sstream>", cxx98
 istringstream, "<sstream>", cxx98
+istringstream, "<sstream>", cxx98
 ostringstream, "<sstream>", cxx98
+stringbuf, "<sstream>", cxx98
 stringstream, "<sstream>", cxx98
+wistringstream, "<sstream>", cxx98
+wostringstream, "<sstream>", cxx98
+wstringbuf, "<sstream>", cxx98
 # <stack>
 stack, "<stack>", cxx98
+# <stacktrace>
+stacktrace, "<stacktrace>", cxx23
+# <stdexcept>
+domain_error, "<stdexcept>", cxx98
+invalid_argument, "<stdexcept>", cxx98
+length_error, "<stdexcept>", cxx98
+logic_error, "<stdexcept>", cxx98
+out_of_range, "<stdexcept>", cxx98
+overflow_error, "<stdexcept>", cxx98
+range_error, "<stdexcept>", cxx98
+runtime_error, "<stdexcept>", cxx98
+underflow_error, "<stdexcept>", cxx98
+# <stop_token>
+stop_callback, "<stop_token>", cxx20
+stop_source, "<stop_token>", cxx20
+stop_token, "<stop_token>", cxx20
+# <streambuf>
+basic_streambuf, "<streambuf>", cxx98
+streambuf, "<streambuf>", cxx98
+wstreambuf, "<streambuf>", cxx98
 # <string>
 basic_string, "<string>", cxx98
+char_traits, "<string>", cxx98
+stod, "<string>", cxx11
+stof, "<string>", cxx11
+stoi, "<string>", cxx11
+stol, "<string>", cxx11
+stold, "<string>", cxx11
+stoll, "<string>", cxx11
+stoul, "<string>", cxx11
+stoull, "<string>", cxx11
 string, "<string>", cxx98
-wstring, "<string>", cxx98
-u8string, "<string>", cxx20
+to_string, "<string>", cxx17
+to_wstring, "<string>", cxx17
 u16string, "<string>", cxx11
 u32string, "<string>", cxx11
+u8string, "<string>", cxx20
+wstring, "<string>", cxx98
 # <string_view>
 basic_string_view, "<string_view>", cxx17
 string_view, "<string_view>", cxx17
+# <system_error>
+errc, "<system_error>", cxx11
+error_category, "<system_error>", cxx11
+error_code, "<system_error>", cxx11
+error_condition, "<system_error>", cxx11
+generic_category, "<system_error>", cxx11
+is_error_code_enum, "<system_error>", cxx11
+is_error_code_enum_v, "<system_error>", cxx17
+is_error_condition_enum, "<system_error>", cxx11
+is_error_condition_enum_v, "<system_error>", cxx17
+make_error_code, "<system_error>", cxx11
+make_error_condition, "<system_error>", cxx11
+system_category, "<system_error>", cxx11
 # <thread>
-thread, "<thread>", cxx11
+jthread, "<thread>", cxx20
 this_thread, "<thread>", cxx11
+thread, "<thread>", cxx11
 # <tuple>
 apply, "<tuple>", cxx17
 forward_as_tuple, "<tuple>", cxx11
@@ -253,35 +405,73 @@ tuple_element_t, "<tuple>", cxx14
 tuple_size, "<tuple>", cxx11
 tuple_size_v, "<tuple>", cxx17
 # <type_traits>
+conjunction, "<type_traits>", cxx17
+conjunction_v, "<type_traits>", cxx17
+disjunction, "<type_traits>", cxx17
+disjunction_v, "<type_traits>", cxx17
 enable_if, "<type_traits>", cxx11
 enable_if_t, "<type_traits>", cxx14
 invoke_result, "<type_traits>", cxx17
 invoke_result_t, "<type_traits>", cxx17
+negation, "<type_traits>", cxx17
+negation_v, "<type_traits>", cxx17
 remove_cvref, "<type_traits>", cxx20
 remove_cvref_t, "<type_traits>", cxx20
 type_identity, "<type_traits>", cxx20
 type_identity_t, "<type_traits>", cxx20
 void_t, "<type_traits>", cxx17
-conjunction, "<type_traits>", cxx17
-conjunction_v, "<type_traits>", cxx17
-disjunction, "<type_traits>", cxx17
-disjunction_v, "<type_traits>", cxx17
-negation, "<type_traits>", cxx17
-negation_v, "<type_traits>", cxx17
+# <typeindex>
+type_index, "<typeindex>", cxx11
+# <typeinfo>
+bad_cast, "<typeinfo>", cxx98
+bad_typeid, "<typeinfo>", cxx98
 # <unordered_map>
 unordered_map, "<unordered_map>", cxx11
 unordered_multimap, "<unordered_map>", cxx11
 # <unordered_set>
-unordered_set, "<unordered_set>", cxx11
 unordered_multiset, "<unordered_set>", cxx11
+unordered_set, "<unordered_set>", cxx11
 # <utility>
+as_const, "<utility>", cxx17
+cmp_equal, "<utility>", cxx20
+cmp_greater, "<utility>", cxx20
+cmp_greater_equal, "<utility>", cxx20
+cmp_less, "<utility>", cxx20
+cmp_less_equal, "<utility>", cxx20
+cmp_not_equal, "<utility>", cxx20
 declval, "<utility>", cxx11
+exchange, "<utility>", cxx14
 forward, "<utility>", cxx11
+in_place, "<utility>", cxx17
+in_place_index, "<utility>", cxx17
+in_place_index_t, "<utility>", cxx17
+in_place_t, "<utility>", cxx17
+in_place_type, "<utility>", cxx17
+in_place_type_t, "<utility>", cxx17
+in_range, "<utility>", cxx20
+index_sequence, "<utility>", cxx14
+index_sequence_for, "<utility>", cxx14
+integer_sequence, "<utility>", cxx14
+make_index_sequence, "<utility>", cxx14
+make_integer_sequence, "<utility>", cxx14
 make_pair, "<utility>", cxx98
 move, "<utility>", cxx11
+move_if_noexcept, "<utility>", cxx11
 pair, "<utility>", cxx98
+piecewise_construct, "<utility>", cxx11
+piecewise_construct_t, "<utility>", cxx11
+to_underlying, "<utility>", cxx23
+unreachable, "<utility>", cxx23
 # <variant>
+bad_variant_access, "<variant>", cxx17
+holds_alternative, "<variant>", cxx17
+monostate, "<variant>", cxx17
 variant, "<variant>", cxx17
+variant_alternative, "<variant>", cxx17
+variant_alternative_t, "<variant>", cxx17
+variant_npos, "<variant>", cxx17
+variant_size, "<variant>", cxx17
+variant_size_v, "<variant>", cxx17
 visit, "<variant>", cxx17
 # <vector>
 vector, "<vector>", cxx98
diff --git a/gcc/cp/std-name-hint.h b/gcc/cp/std-name-hint.h
index c48eac30f90..9fb8c89990c 100644
--- a/gcc/cp/std-name-hint.h
+++ b/gcc/cp/std-name-hint.h
@@ -1,5 +1,5 @@
 /* C++ code produced by gperf version 3.1 */
-/* Command-line: gperf -o -C -E -D -N find -L C++ --output-file std-name-hint.h -k'1,2,7,11,$' std-name-hint.gperf  */
+/* Command-line: gperf -o -C -E -k '1,2,7,11,$' -D -N find -L C++ --output-file std-name-hint.h std-name-hint.gperf  */
 
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
       && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
@@ -30,6 +30,7 @@
 
 #line 4 "std-name-hint.gperf"
 
+/* This file is auto-generated by gen-cxxapi-file.py.  */
 /* Copyright (C) 2022 Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -47,7 +48,7 @@ for more details.
 You should have received a copy of the GNU General Public License
 along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
-#line 23 "std-name-hint.gperf"
+#line 24 "std-name-hint.gperf"
 struct std_name_hint
 {
   /* A name within "std::".  */
@@ -60,7 +61,7 @@ struct std_name_hint
   /* The dialect of C++ in which this was added.  */
   enum cxx_dialect min_dialect;
 };
-/* maximum key range = 626, duplicates = 4 */
+/* maximum key range = 1387, duplicates = 6 */
 
 class std_name_hint_lookup
 {
@@ -75,32 +76,32 @@ std_name_hint_lookup::hash (const char *str, size_t len)
 {
   static const unsigned short asso_values[] =
     {
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635,   5,
-      635,   0, 635, 635, 635, 635,  25, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635,  45, 635,  25,  70, 165,
-       20,   0,  35, 225, 190,  95, 635, 120, 183,  10,
-        5,  25, 165,   5,   5,  10,   0,  55,   4, 143,
-      115, 229, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635, 635, 635, 635, 635,
-      635, 635, 635, 635, 635, 635
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,   10,
+        25,    5,   20, 1412,    0, 1412,    5,    0,   15, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412,  260, 1412,  430,   15,  323,
+       305,    5,   55,  198,  475,  125,  240,  105,  225,   50,
+         5,  155,  105,  440,   85,    5,    0,   10,   15,  124,
+       470,  463,   65, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412, 1412,
+      1412, 1412, 1412, 1412, 1412, 1412, 1412
     };
   unsigned int hval = len;
 
@@ -120,523 +121,966 @@ std_name_hint_lookup::hash (const char *str, size_t len)
       case 4:
       case 3:
       case 2:
-        hval += asso_values[static_cast<unsigned char>(str[1])];
+        hval += asso_values[static_cast<unsigned char>(str[1]+1)];
       /*FALLTHROUGH*/
       case 1:
         hval += asso_values[static_cast<unsigned char>(str[0])];
         break;
-    }
+    
   return hval + asso_values[static_cast<unsigned char>(str[len - 1])];
-}
+
 
 const struct std_name_hint *
 std_name_hint_lookup::find (const char *str, size_t len)
 {
   enum
     {
-      TOTAL_KEYWORDS = 205,
+      TOTAL_KEYWORDS = 378,
       MIN_WORD_LENGTH = 2,
-      MAX_WORD_LENGTH = 22,
-      MIN_HASH_VALUE = 9,
-      MAX_HASH_VALUE = 634
+      MAX_WORD_LENGTH = 39,
+      MIN_HASH_VALUE = 25,
+      MAX_HASH_VALUE = 1411
     };
 
   static const struct std_name_hint wordlist[] =
     {
-#line 158 "std-name-hint.gperf"
-      {"next", "<iterator>", cxx11},
-#line 212 "std-name-hint.gperf"
+#line 401 "std-name-hint.gperf"
+      {"tuple", "<tuple>", cxx11},
+#line 276 "std-name-hint.gperf"
+      {"nullopt", "<optional>", cxx17},
+#line 405 "std-name-hint.gperf"
+      {"tuple_size", "<tuple>", cxx11},
+#line 469 "std-name-hint.gperf"
+      {"variant", "<variant>", cxx17},
+#line 403 "std-name-hint.gperf"
+      {"tuple_element", "<tuple>", cxx11},
+#line 404 "std-name-hint.gperf"
+      {"tuple_element_t", "<tuple>", cxx14},
+#line 426 "std-name-hint.gperf"
+      {"bad_cast", "<typeinfo>", cxx98},
+#line 471 "std-name-hint.gperf"
+      {"variant_alternative_t", "<variant>", cxx17},
+#line 470 "std-name-hint.gperf"
+      {"variant_alternative", "<variant>", cxx17},
+#line 267 "std-name-hint.gperf"
+      {"numbers::ln2_v", "<numbers>", cxx20},
+#line 266 "std-name-hint.gperf"
+      {"numbers::ln10_v", "<numbers>", cxx20},
+#line 263 "std-name-hint.gperf"
+      {"numbers::inv_pi_v", "<numbers>", cxx20},
+#line 300 "std-name-hint.gperf"
       {"set", "<set>", cxx98},
-#line 287 "std-name-hint.gperf"
-      {"vector", "<vector>", cxx98},
-#line 101 "std-name-hint.gperf"
+#line 183 "std-name-hint.gperf"
+      {"next", "<iterator>", cxx11},
+#line 264 "std-name-hint.gperf"
+      {"numbers::inv_sqrt3_v", "<numbers>", cxx20},
+#line 265 "std-name-hint.gperf"
+      {"numbers::inv_sqrtpi_v", "<numbers>", cxx20},
+#line 361 "std-name-hint.gperf"
+      {"stof", "<string>", cxx11},
+#line 129 "std-name-hint.gperf"
       {"setbase", "<iomanip>", cxx98},
-#line 165 "std-name-hint.gperf"
-      {"ends", "<ostream>", cxx98},
-#line 205 "std-name-hint.gperf"
-      {"ends", "<ostream>", cxx98},
-#line 86 "std-name-hint.gperf"
+#line 299 "std-name-hint.gperf"
+      {"multiset", "<set>", cxx98},
+#line 174 "std-name-hint.gperf"
+      {"begin", "<iterator>", cxx11},
+#line 119 "std-name-hint.gperf"
+      {"future", "<future>", cxx11},
+#line 70 "std-name-hint.gperf"
+      {"byte", "<cstddef>", cxx17},
+#line 399 "std-name-hint.gperf"
+      {"make_tuple", "<tuple>", cxx11},
+#line 216 "std-name-hint.gperf"
+      {"make_unique", "<memory>", cxx14},
+#line 330 "std-name-hint.gperf"
+      {"stringbuf", "<sstream>", cxx98},
+#line 355 "std-name-hint.gperf"
+      {"streambuf", "<streambuf>", cxx98},
+#line 456 "std-name-hint.gperf"
+      {"make_integer_sequence", "<utility>", cxx14},
+#line 217 "std-name-hint.gperf"
+      {"make_unique_for_overwrite", "<memory>", cxx20},
+#line 313 "std-name-hint.gperf"
+      {"basic_spanstream", "<spanstream>", cxx23},
+#line 326 "std-name-hint.gperf"
+      {"basic_stringstream", "<sstream>", cxx98},
+#line 325 "std-name-hint.gperf"
+      {"basic_stringbuf", "<sstream>", cxx98},
+#line 473 "std-name-hint.gperf"
+      {"variant_size", "<variant>", cxx17},
+#line 338 "std-name-hint.gperf"
+      {"stacktrace", "<stacktrace>", cxx23},
+#line 110 "std-name-hint.gperf"
       {"mem_fn", "<functional>", cxx11},
-#line 69 "std-name-hint.gperf"
-      {"deque", "<deque>", cxx98},
-#line 162 "std-name-hint.gperf"
-      {"reverse_iterator", "<iterator>", cxx98},
-#line 151 "std-name-hint.gperf"
-      {"end", "<iterator>", cxx11},
-#line 264 "std-name-hint.gperf"
+#line 312 "std-name-hint.gperf"
+      {"basic_spanbuf", "<spanstream>", cxx23},
+#line 283 "std-name-hint.gperf"
+      {"flush_emit", "<ostream>", cxx20},
+#line 111 "std-name-hint.gperf"
+      {"not_fn", "<functional>", cxx17},
+#line 474 "std-name-hint.gperf"
+      {"variant_size_v", "<variant>", cxx17},
+#line 336 "std-name-hint.gperf"
+      {"stack", "<stack>", cxx98},
+#line 422 "std-name-hint.gperf"
       {"void_t", "<type_traits>", cxx17},
-#line 284 "std-name-hint.gperf"
-      {"variant", "<variant>", cxx17},
-#line 281 "std-name-hint.gperf"
+#line 121 "std-name-hint.gperf"
+      {"promise", "<future>", cxx11},
+#line 186 "std-name-hint.gperf"
+      {"prev", "<iterator>", cxx11},
+#line 170 "std-name-hint.gperf"
+      {"ws", "<istream>", cxx98},
+#line 173 "std-name-hint.gperf"
+      {"back_inserter", "<iterator>", cxx98},
+#line 131 "std-name-hint.gperf"
+      {"setiosflags", "<iomanip>", cxx98},
+#line 466 "std-name-hint.gperf"
+      {"bad_variant_access", "<variant>", cxx17},
+#line 288 "std-name-hint.gperf"
+      {"priority_queue", "<queue>", cxx98},
+#line 144 "std-name-hint.gperf"
+      {"noshowbase", "<ios>", cxx98},
+#line 362 "std-name-hint.gperf"
+      {"stoi", "<string>", cxx11},
+#line 155 "std-name-hint.gperf"
+      {"showpos", "<ios>", cxx98},
+#line 153 "std-name-hint.gperf"
+      {"showbase", "<ios>", cxx98},
+#line 235 "std-name-hint.gperf"
+      {"pmr::new_delete_resource", "<memory_resource>", cxx17},
+#line 232 "std-name-hint.gperf"
+      {"pmr::get_default_resource", "<memory_resource>", cxx17},
+#line 238 "std-name-hint.gperf"
+      {"pmr::set_default_resource", "<memory_resource>", cxx17},
+#line 97 "std-name-hint.gperf"
+      {"basic_fstream", "<fstream>", cxx98},
+#line 477 "std-name-hint.gperf"
+      {"vector", "<vector>", cxx98},
+#line 100 "std-name-hint.gperf"
+      {"fstream", "<fstream>", cxx98},
+#line 458 "std-name-hint.gperf"
       {"move", "<utility>", cxx11},
-#line 87 "std-name-hint.gperf"
-      {"not_fn", "<functional>", cxx17},
+#line 96 "std-name-hint.gperf"
+      {"basic_filebuf", "<fstream>", cxx98},
+#line 281 "std-name-hint.gperf"
+      {"ends", "<ostream>", cxx98},
+#line 398 "std-name-hint.gperf"
+      {"make_from_tuple", "<tuple>", cxx17},
+#line 191 "std-name-hint.gperf"
+      {"map", "<map>", cxx98},
+#line 271 "std-name-hint.gperf"
+      {"numbers::pi_v", "<numbers>", cxx20},
+#line 376 "std-name-hint.gperf"
+      {"basic_string_view", "<string_view>", cxx17},
+#line 126 "std-name-hint.gperf"
+      {"put_time", "<iomanip>", cxx11},
+#line 352 "std-name-hint.gperf"
+      {"stop_token", "<stop_token>", cxx20},
+#line 133 "std-name-hint.gperf"
+      {"setw", "<iomanip>", cxx98},
+#line 148 "std-name-hint.gperf"
+      {"nounitbuf", "<ios>", cxx98},
+#line 351 "std-name-hint.gperf"
+      {"stop_source", "<stop_token>", cxx20},
+#line 213 "std-name-hint.gperf"
+      {"make_obj_using_allocator", "<memory>", cxx20},
+#line 321 "std-name-hint.gperf"
+      {"wspanbuf", "<spanstream>", cxx23},
+#line 231 "std-name-hint.gperf"
+      {"pmr", "<memory_resource>", cxx17},
+#line 472 "std-name-hint.gperf"
+      {"variant_npos", "<variant>", cxx17},
+#line 223 "std-name-hint.gperf"
+      {"to_address", "<memory>", cxx11},
+#line 460 "std-name-hint.gperf"
+      {"pair", "<utility>", cxx98},
 #line 269 "std-name-hint.gperf"
+      {"numbers::log2e_v", "<numbers>", cxx20},
+#line 268 "std-name-hint.gperf"
+      {"numbers::log10e_v", "<numbers>", cxx20},
+#line 149 "std-name-hint.gperf"
+      {"nouppercase", "<ios>", cxx98},
+#line 368 "std-name-hint.gperf"
+      {"string", "<string>", cxx98},
+#line 373 "std-name-hint.gperf"
+      {"u8string", "<string>", cxx20},
+#line 145 "std-name-hint.gperf"
+      {"noshowpoint", "<ios>", cxx98},
+#line 310 "std-name-hint.gperf"
+      {"basic_ispanstream", "<spanstream>", cxx23},
+#line 416 "std-name-hint.gperf"
       {"negation", "<type_traits>", cxx17},
-#line 270 "std-name-hint.gperf"
+#line 146 "std-name-hint.gperf"
+      {"noshowpos", "<ios>", cxx98},
+#line 459 "std-name-hint.gperf"
+      {"move_if_noexcept", "<utility>", cxx11},
+#line 169 "std-name-hint.gperf"
+      {"istream", "<istream>", cxx98},
+#line 314 "std-name-hint.gperf"
+      {"ispanstream", "<spanstream>", cxx23},
+#line 315 "std-name-hint.gperf"
+      {"ispanstream", "<spanstream>", cxx23},
+#line 106 "std-name-hint.gperf"
+      {"function", "<functional>", cxx11},
+#line 356 "std-name-hint.gperf"
+      {"wstreambuf", "<streambuf>", cxx98},
+#line 417 "std-name-hint.gperf"
       {"negation_v", "<type_traits>", cxx17},
-#line 122 "std-name-hint.gperf"
-      {"nouppercase", "<ios>", cxx98},
-#line 43 "std-name-hint.gperf"
-      {"any_cast", "<any>", cxx17},
-#line 181 "std-name-hint.gperf"
-      {"make_unique", "<memory>", cxx14},
+#line 156 "std-name-hint.gperf"
+      {"skipws", "<ios>", cxx98},
+#line 259 "std-name-hint.gperf"
+      {"nothrow_t", "<new>", cxx98},
+#line 363 "std-name-hint.gperf"
+      {"stol", "<string>", cxx11},
+#line 365 "std-name-hint.gperf"
+      {"stoll", "<string>", cxx11},
+#line 366 "std-name-hint.gperf"
+      {"stoul", "<string>", cxx11},
+#line 367 "std-name-hint.gperf"
+      {"stoull", "<string>", cxx11},
 #line 147 "std-name-hint.gperf"
-      {"advance", "<iterator>", cxx98},
-#line 157 "std-name-hint.gperf"
+      {"noskipws", "<ios>", cxx98},
+#line 400 "std-name-hint.gperf"
+      {"tie", "<tuple>", cxx11},
+#line 220 "std-name-hint.gperf"
+      {"reinterpret_pointer_cast", "<memory>", cxx17},
+#line 358 "std-name-hint.gperf"
+      {"basic_string", "<string>", cxx98},
+#line 187 "std-name-hint.gperf"
+      {"reverse_iterator", "<iterator>", cxx98},
+#line 182 "std-name-hint.gperf"
       {"move_iterator", "<iterator>", cxx11},
-#line 246 "std-name-hint.gperf"
-      {"make_from_tuple", "<tuple>", cxx17},
-#line 134 "std-name-hint.gperf"
-      {"defaultfloat", "<ios>", cxx11},
-#line 249 "std-name-hint.gperf"
-      {"tuple", "<tuple>", cxx11},
-#line 257 "std-name-hint.gperf"
-      {"enable_if_t", "<type_traits>", cxx14},
-#line 164 "std-name-hint.gperf"
-      {"ostream", "<ostream>", cxx98},
-#line 203 "std-name-hint.gperf"
+#line 262 "std-name-hint.gperf"
+      {"numbers::egamma_v", "<numbers>", cxx20},
+#line 311 "std-name-hint.gperf"
+      {"basic_ospanstream", "<spanstream>", cxx23},
+#line 475 "std-name-hint.gperf"
+      {"visit", "<variant>", cxx17},
+#line 56 "std-name-hint.gperf"
+      {"bitset", "<bitset>", cxx11},
+#line 285 "std-name-hint.gperf"
       {"ostream", "<ostream>", cxx98},
-#line 261 "std-name-hint.gperf"
-      {"remove_cvref_t", "<type_traits>", cxx20},
-#line 209 "std-name-hint.gperf"
-      {"queue", "<queue>", cxx98},
-#line 159 "std-name-hint.gperf"
-      {"ostream_iterator", "<iterator>", cxx98},
-#line 227 "std-name-hint.gperf"
-      {"stringstream", "<sstream>", cxx98},
-#line 251 "std-name-hint.gperf"
-      {"tuple_element", "<tuple>", cxx11},
-#line 252 "std-name-hint.gperf"
-      {"tuple_element_t", "<tuple>", cxx14},
-#line 77 "std-name-hint.gperf"
-      {"fstream", "<fstream>", cxx98},
-#line 213 "std-name-hint.gperf"
-      {"multiset", "<set>", cxx98},
-#line 280 "std-name-hint.gperf"
-      {"make_pair", "<utility>", cxx98},
-#line 253 "std-name-hint.gperf"
-      {"tuple_size", "<tuple>", cxx11},
-#line 100 "std-name-hint.gperf"
-      {"setiosflags", "<iomanip>", cxx98},
-#line 99 "std-name-hint.gperf"
-      {"resetiosflags", "<iomanip>", cxx98},
-#line 149 "std-name-hint.gperf"
-      {"begin", "<iterator>", cxx11},
-#line 109 "std-name-hint.gperf"
-      {"quoted", "<iomanip>", cxx14},
-#line 275 "std-name-hint.gperf"
+#line 154 "std-name-hint.gperf"
+      {"showpoint", "<ios>", cxx98},
+#line 316 "std-name-hint.gperf"
+      {"ospanstream", "<spanstream>", cxx23},
+#line 433 "std-name-hint.gperf"
       {"unordered_set", "<unordered_set>", cxx11},
-#line 276 "std-name-hint.gperf"
-      {"unordered_multiset", "<unordered_set>", cxx11},
-#line 256 "std-name-hint.gperf"
-      {"enable_if", "<type_traits>", cxx11},
-#line 95 "std-name-hint.gperf"
-      {"future", "<future>", cxx11},
-#line 260 "std-name-hint.gperf"
-      {"remove_cvref", "<type_traits>", cxx20},
-#line 248 "std-name-hint.gperf"
-      {"tie", "<tuple>", cxx11},
-#line 247 "std-name-hint.gperf"
-      {"make_tuple", "<tuple>", cxx11},
-#line 71 "std-name-hint.gperf"
-      {"forward_list", "<forward_list>", cxx11},
-#line 79 "std-name-hint.gperf"
-      {"ofstream", "<fstream>", cxx98},
-#line 285 "std-name-hint.gperf"
-      {"visit", "<variant>", cxx17},
-#line 127 "std-name-hint.gperf"
-      {"right", "<ios>", cxx98},
-#line 85 "std-name-hint.gperf"
-      {"invoke", "<functional>", cxx17},
-#line 279 "std-name-hint.gperf"
-      {"forward", "<utility>", cxx11},
-#line 114 "std-name-hint.gperf"
-      {"noshowbase", "<ios>", cxx98},
-#line 153 "std-name-hint.gperf"
-      {"inserter", "<iterator>", cxx98},
-#line 160 "std-name-hint.gperf"
-      {"ostreambuf_iterator", "<iterator>", cxx98},
-#line 51 "std-name-hint.gperf"
-      {"atomic_ref", "<atomic>", cxx20},
-#line 112 "std-name-hint.gperf"
-      {"noboolalpha", "<ios>", cxx98},
-#line 148 "std-name-hint.gperf"
-      {"back_inserter", "<iterator>", cxx98},
-#line 183 "std-name-hint.gperf"
-      {"unique_ptr", "<memory>", cxx11},
-#line 89 "std-name-hint.gperf"
-      {"unwrap_reference", "<functional>", cxx20},
-#line 90 "std-name-hint.gperf"
-      {"unwrap_reference_t", "<functional>", cxx20},
-#line 219 "std-name-hint.gperf"
-      {"source_location", "<source_location>", cxx20},
-#line 254 "std-name-hint.gperf"
-      {"tuple_size_v", "<tuple>", cxx17},
-#line 83 "std-name-hint.gperf"
-      {"function", "<functional>", cxx11},
-#line 144 "std-name-hint.gperf"
-      {"istream", "<istream>", cxx98},
+#line 78 "std-name-hint.gperf"
+      {"uint_least64_t", "<cstdint>", cxx11},
 #line 229 "std-name-hint.gperf"
-      {"stack", "<stack>", cxx98},
-#line 154 "std-name-hint.gperf"
+      {"weak_ptr", "<memory>", cxx11},
+#line 79 "std-name-hint.gperf"
+      {"uint_least8_t", "<cstdint>", cxx11},
+#line 77 "std-name-hint.gperf"
+      {"uint_least32_t", "<cstdint>", cxx11},
+#line 76 "std-name-hint.gperf"
+      {"uint_least16_t", "<cstdint>", cxx11},
+#line 179 "std-name-hint.gperf"
       {"istream_iterator", "<iterator>", cxx98},
-#line 123 "std-name-hint.gperf"
+#line 157 "std-name-hint.gperf"
       {"unitbuf", "<ios>", cxx98},
-#line 224 "std-name-hint.gperf"
-      {"basic_stringstream", "<sstream>", cxx98},
-#line 245 "std-name-hint.gperf"
-      {"forward_as_tuple", "<tuple>", cxx11},
+#line 142 "std-name-hint.gperf"
+      {"left", "<ios>", cxx98},
+#line 346 "std-name-hint.gperf"
+      {"range_error", "<stdexcept>", cxx98},
+#line 347 "std-name-hint.gperf"
+      {"runtime_error", "<stdexcept>", cxx98},
+#line 108 "std-name-hint.gperf"
+      {"invoke", "<functional>", cxx17},
+#line 222 "std-name-hint.gperf"
+      {"static_pointer_cast", "<memory>", cxx11},
+#line 98 "std-name-hint.gperf"
+      {"basic_ifstream", "<fstream>", cxx98},
+#line 406 "std-name-hint.gperf"
+      {"tuple_size_v", "<tuple>", cxx17},
+#line 452 "std-name-hint.gperf"
+      {"index_sequence", "<utility>", cxx14},
+#line 184 "std-name-hint.gperf"
+      {"ostream_iterator", "<iterator>", cxx98},
+#line 261 "std-name-hint.gperf"
+      {"numbers::e_v", "<numbers>", cxx20},
 #line 124 "std-name-hint.gperf"
-      {"nounitbuf", "<ios>", cxx98},
-#line 119 "std-name-hint.gperf"
-      {"skipws", "<ios>", cxx98},
-#line 75 "std-name-hint.gperf"
+      {"get_time", "<iomanip>", cxx11},
+#line 432 "std-name-hint.gperf"
+      {"unordered_multiset", "<unordered_set>", cxx11},
+#line 360 "std-name-hint.gperf"
+      {"stod", "<string>", cxx11},
+#line 364 "std-name-hint.gperf"
+      {"stold", "<string>", cxx11},
+#line 151 "std-name-hint.gperf"
+      {"right", "<ios>", cxx98},
+#line 99 "std-name-hint.gperf"
       {"basic_ofstream", "<fstream>", cxx98},
-#line 156 "std-name-hint.gperf"
-      {"iterator_traits", "<iterator>", cxx98},
-#line 76 "std-name-hint.gperf"
-      {"basic_fstream", "<fstream>", cxx98},
-#line 131 "std-name-hint.gperf"
-      {"fixed", "<ios>", cxx98},
-#line 184 "std-name-hint.gperf"
-      {"weak_ptr", "<memory>", cxx11},
-#line 104 "std-name-hint.gperf"
-      {"setw", "<iomanip>", cxx98},
-#line 152 "std-name-hint.gperf"
-      {"front_inserter", "<iterator>", cxx98},
-#line 221 "std-name-hint.gperf"
-      {"basic_stringbuf", "<sstream>", cxx98},
-#line 145 "std-name-hint.gperf"
-      {"ws", "<istream>", cxx98},
-#line 92 "std-name-hint.gperf"
-      {"unwrap_ref_decay_t", "<functional>", cxx20},
-#line 53 "std-name-hint.gperf"
-      {"bitset", "<bitset>", cxx11},
-#line 78 "std-name-hint.gperf"
-      {"ifstream", "<fstream>", cxx98},
-#line 138 "std-name-hint.gperf"
-      {"cerr", "<iostream>", cxx98},
-#line 88 "std-name-hint.gperf"
-      {"reference_wrapper", "<functional>", cxx11},
-#line 97 "std-name-hint.gperf"
-      {"promise", "<future>", cxx11},
-#line 161 "std-name-hint.gperf"
-      {"prev", "<iterator>", cxx11},
-#line 82 "std-name-hint.gperf"
-      {"bind_front", "<functional>", cxx20},
-#line 186 "std-name-hint.gperf"
-      {"pmr", "<memory_resource>", cxx17},
-#line 155 "std-name-hint.gperf"
-      {"istreambuf_iterator", "<iterator>", cxx98},
-#line 188 "std-name-hint.gperf"
-      {"mutex", "<mutex>", cxx11},
-#line 126 "std-name-hint.gperf"
-      {"left", "<ios>", cxx98},
-#line 128 "std-name-hint.gperf"
-      {"dec", "<ios>", cxx98},
+#line 379 "std-name-hint.gperf"
+      {"errc", "<system_error>", cxx11},
 #line 81 "std-name-hint.gperf"
-      {"bind", "<functional>", cxx11},
-#line 120 "std-name-hint.gperf"
-      {"noskipws", "<ios>", cxx98},
-#line 167 "std-name-hint.gperf"
-      {"endl", "<ostream>", cxx98},
-#line 207 "std-name-hint.gperf"
-      {"endl", "<ostream>", cxx98},
-#line 130 "std-name-hint.gperf"
-      {"oct", "<ios>", cxx98},
-#line 137 "std-name-hint.gperf"
-      {"cout", "<iostream>", cxx98},
-#line 49 "std-name-hint.gperf"
-      {"atomic", "<atomic>", cxx11},
-#line 282 "std-name-hint.gperf"
-      {"pair", "<utility>", cxx98},
-#line 174 "std-name-hint.gperf"
-      {"map", "<map>", cxx98},
-#line 193 "std-name-hint.gperf"
+      {"uintptr_t", "<cstdint>", cxx11},
+#line 439 "std-name-hint.gperf"
+      {"cmp_less", "<utility>", cxx20},
+#line 402 "std-name-hint.gperf"
+      {"tuple_cat", "<tuple>", cxx11},
+#line 381 "std-name-hint.gperf"
+      {"error_code", "<system_error>", cxx11},
+#line 323 "std-name-hint.gperf"
+      {"basic_istringstream", "<sstream>", cxx98},
+#line 105 "std-name-hint.gperf"
+      {"bind_front", "<functional>", cxx20},
+#line 455 "std-name-hint.gperf"
+      {"make_index_sequence", "<utility>", cxx14},
+#line 242 "std-name-hint.gperf"
       {"call_once", "<mutex>", cxx11},
-#line 94 "std-name-hint.gperf"
-      {"async", "<future>", cxx11},
-#line 116 "std-name-hint.gperf"
-      {"noshowpoint", "<ios>", cxx98},
-#line 204 "std-name-hint.gperf"
-      {"wostream", "<ostream>", cxx98},
+#line 372 "std-name-hint.gperf"
+      {"u32string", "<string>", cxx11},
 #line 258 "std-name-hint.gperf"
-      {"invoke_result", "<type_traits>", cxx17},
-#line 118 "std-name-hint.gperf"
-      {"noshowpos", "<ios>", cxx98},
-#line 259 "std-name-hint.gperf"
-      {"invoke_result_t", "<type_traits>", cxx17},
-#line 241 "std-name-hint.gperf"
-      {"thread", "<thread>", cxx11},
-#line 103 "std-name-hint.gperf"
-      {"setprecision", "<iomanip>", cxx98},
-#line 113 "std-name-hint.gperf"
-      {"showbase", "<ios>", cxx98},
-#line 74 "std-name-hint.gperf"
-      {"basic_ifstream", "<fstream>", cxx98},
+      {"nothrow", "<new>", cxx98},
+#line 371 "std-name-hint.gperf"
+      {"u16string", "<string>", cxx11},
+#line 177 "std-name-hint.gperf"
+      {"front_inserter", "<iterator>", cxx98},
+#line 83 "std-name-hint.gperf"
+      {"deque", "<deque>", cxx98},
+#line 112 "std-name-hint.gperf"
+      {"reference_wrapper", "<functional>", cxx11},
 #line 178 "std-name-hint.gperf"
-      {"allocator", "<memory>", cxx98},
-#line 133 "std-name-hint.gperf"
-      {"hexfloat", "<ios>", cxx11},
-#line 117 "std-name-hint.gperf"
-      {"showpos", "<ios>", cxx98},
-#line 170 "std-name-hint.gperf"
-      {"flush_emit", "<ostream>", cxx20},
-#line 250 "std-name-hint.gperf"
-      {"tuple_cat", "<tuple>", cxx11},
-#line 179 "std-name-hint.gperf"
-      {"allocator_traits", "<memory>", cxx11},
-#line 191 "std-name-hint.gperf"
-      {"recursive_timed_mutex", "<mutex>", cxx11},
-#line 108 "std-name-hint.gperf"
-      {"put_time", "<iomanip>", cxx11},
-#line 210 "std-name-hint.gperf"
-      {"priority_queue", "<queue>", cxx98},
-#line 190 "std-name-hint.gperf"
-      {"recursive_mutex", "<mutex>", cxx11},
-#line 232 "std-name-hint.gperf"
-      {"string", "<string>", cxx98},
-#line 107 "std-name-hint.gperf"
-      {"get_time", "<iomanip>", cxx11},
-#line 223 "std-name-hint.gperf"
+      {"inserter", "<iterator>", cxx98},
+#line 324 "std-name-hint.gperf"
       {"basic_ostringstream", "<sstream>", cxx98},
-#line 73 "std-name-hint.gperf"
-      {"basic_filebuf", "<fstream>", cxx98},
-#line 272 "std-name-hint.gperf"
+#line 333 "std-name-hint.gperf"
+      {"wostringstream", "<sstream>", cxx98},
+#line 334 "std-name-hint.gperf"
+      {"wstringbuf", "<sstream>", cxx98},
+#line 280 "std-name-hint.gperf"
+      {"endl", "<ostream>", cxx98},
+#line 327 "std-name-hint.gperf"
+      {"istringstream", "<sstream>", cxx98},
+#line 328 "std-name-hint.gperf"
+      {"istringstream", "<sstream>", cxx98},
+#line 453 "std-name-hint.gperf"
+      {"index_sequence_for", "<utility>", cxx14},
+#line 181 "std-name-hint.gperf"
+      {"iterator_traits", "<iterator>", cxx98},
+#line 370 "std-name-hint.gperf"
+      {"to_wstring", "<string>", cxx17},
+#line 275 "std-name-hint.gperf"
+      {"make_optional", "<optional>", cxx17},
+#line 257 "std-name-hint.gperf"
+      {"launder", "<new>", cxx17},
+#line 429 "std-name-hint.gperf"
       {"unordered_map", "<unordered_map>", cxx11},
-#line 121 "std-name-hint.gperf"
-      {"uppercase", "<ios>", cxx98},
-#line 273 "std-name-hint.gperf"
+#line 419 "std-name-hint.gperf"
+      {"remove_cvref_t", "<type_traits>", cxx20},
+#line 329 "std-name-hint.gperf"
+      {"ostringstream", "<sstream>", cxx98},
+#line 430 "std-name-hint.gperf"
       {"unordered_multimap", "<unordered_map>", cxx11},
-#line 182 "std-name-hint.gperf"
+#line 388 "std-name-hint.gperf"
+      {"make_error_code", "<system_error>", cxx11},
+#line 413 "std-name-hint.gperf"
+      {"enable_if_t", "<type_traits>", cxx14},
+#line 163 "std-name-hint.gperf"
+      {"cout", "<iostream>", cxx98},
+#line 167 "std-name-hint.gperf"
+      {"wcout", "<iostream>", cxx98},
+#line 389 "std-name-hint.gperf"
+      {"make_error_condition", "<system_error>", cxx11},
+#line 394 "std-name-hint.gperf"
+      {"thread", "<thread>", cxx11},
+#line 369 "std-name-hint.gperf"
+      {"to_string", "<string>", cxx17},
+#line 165 "std-name-hint.gperf"
+      {"wcin", "<iostream>", cxx98},
+#line 243 "std-name-hint.gperf"
+      {"lock", "<mutex>", cxx11},
+#line 251 "std-name-hint.gperf"
+      {"try_lock", "<mutex>", cxx11},
+#line 237 "std-name-hint.gperf"
+      {"pmr::pool_options", "<memory_resource>", cxx17},
+#line 435 "std-name-hint.gperf"
+      {"as_const", "<utility>", cxx17},
+#line 463 "std-name-hint.gperf"
+      {"to_underlying", "<utility>", cxx23},
+#line 116 "std-name-hint.gperf"
+      {"unwrap_reference_t", "<functional>", cxx20},
+#line 427 "std-name-hint.gperf"
+      {"bad_typeid", "<typeinfo>", cxx98},
+#line 115 "std-name-hint.gperf"
+      {"unwrap_reference", "<functional>", cxx20},
+#line 172 "std-name-hint.gperf"
+      {"advance", "<iterator>", cxx98},
+#line 308 "std-name-hint.gperf"
+      {"span", "<span>", cxx20},
+#line 234 "std-name-hint.gperf"
+      {"pmr::monotonic_buffer_resource", "<memory_resource>", cxx17},
+#line 297 "std-name-hint.gperf"
+      {"counting_semaphore", "<semaphore>", cxx20},
+#line 150 "std-name-hint.gperf"
+      {"oct", "<ios>", cxx98},
+#line 289 "std-name-hint.gperf"
+      {"queue", "<queue>", cxx98},
+#line 160 "std-name-hint.gperf"
+      {"cerr", "<iostream>", cxx98},
+#line 176 "std-name-hint.gperf"
+      {"end", "<iterator>", cxx11},
+#line 189 "std-name-hint.gperf"
+      {"list", "<list>", cxx98},
+#line 385 "std-name-hint.gperf"
+      {"is_error_code_enum_v", "<system_error>", cxx17},
+#line 418 "std-name-hint.gperf"
+      {"remove_cvref", "<type_traits>", cxx20},
+#line 387 "std-name-hint.gperf"
+      {"is_error_condition_enum_v", "<system_error>", cxx17},
+#line 240 "std-name-hint.gperf"
+      {"pmr::unsynchronized_pool_resource", "<memory_resource>", cxx17},
+#line 382 "std-name-hint.gperf"
+      {"error_condition", "<system_error>", cxx11},
+#line 224 "std-name-hint.gperf"
+      {"uninitialized_construct_using_allocator", "<memory>", cxx20},
+#line 94 "std-name-hint.gperf"
+      {"forward_list", "<forward_list>", cxx11},
+#line 412 "std-name-hint.gperf"
+      {"enable_if", "<type_traits>", cxx11},
+#line 221 "std-name-hint.gperf"
       {"shared_ptr", "<memory>", cxx11},
-#line 42 "std-name-hint.gperf"
-      {"any", "<any>", cxx17},
-#line 175 "std-name-hint.gperf"
-      {"multimap", "<map>", cxx98},
-#line 46 "std-name-hint.gperf"
-      {"array", "<array>", cxx11},
-#line 136 "std-name-hint.gperf"
-      {"cin", "<iostream>", cxx98},
-#line 238 "std-name-hint.gperf"
-      {"basic_string_view", "<string_view>", cxx17},
-#line 168 "std-name-hint.gperf"
+#line 195 "std-name-hint.gperf"
+      {"align", "<memory>", cxx11},
+#line 451 "std-name-hint.gperf"
+      {"in_range", "<utility>", cxx20},
+#line 60 "std-name-hint.gperf"
+      {"strong_ordering", "<compare>", cxx20},
+#line 348 "std-name-hint.gperf"
+      {"underflow_error", "<stdexcept>", cxx98},
+#line 272 "std-name-hint.gperf"
+      {"numbers::sqrt2_v", "<numbers>", cxx20},
+#line 273 "std-name-hint.gperf"
+      {"numbers::sqrt3_v", "<numbers>", cxx20},
+#line 89 "std-name-hint.gperf"
+      {"terminate", "<exception>", cxx98},
+#line 201 "std-name-hint.gperf"
+      {"allocator_traits", "<memory>", cxx11},
+#line 384 "std-name-hint.gperf"
+      {"is_error_code_enum", "<system_error>", cxx11},
+#line 194 "std-name-hint.gperf"
+      {"addressof", "<memory>", cxx11},
+#line 386 "std-name-hint.gperf"
+      {"is_error_condition_enum", "<system_error>", cxx11},
+#line 421 "std-name-hint.gperf"
+      {"type_identity_t", "<type_traits>", cxx20},
+#line 331 "std-name-hint.gperf"
+      {"stringstream", "<sstream>", cxx98},
+#line 279 "std-name-hint.gperf"
       {"emit_on_flush", "<ostream>", cxx20},
+#line 437 "std-name-hint.gperf"
+      {"cmp_greater", "<utility>", cxx20},
+#line 343 "std-name-hint.gperf"
+      {"logic_error", "<stdexcept>", cxx98},
+#line 130 "std-name-hint.gperf"
+      {"setfill", "<iomanip>", cxx98},
+#line 332 "std-name-hint.gperf"
+      {"wistringstream", "<sstream>", cxx98},
+#line 164 "std-name-hint.gperf"
+      {"wcerr", "<iostream>", cxx98},
+#line 225 "std-name-hint.gperf"
+      {"unique_ptr", "<memory>", cxx11},
+#line 374 "std-name-hint.gperf"
+      {"wstring", "<string>", cxx98},
+#line 270 "std-name-hint.gperf"
+      {"numbers::phi_v", "<numbers>", cxx20},
+#line 236 "std-name-hint.gperf"
+      {"pmr::polymorphic_allocator", "<memory_resource>", cxx17},
+#line 211 "std-name-hint.gperf"
+      {"enable_shared_from_this", "<memory>", cxx11},
+#line 377 "std-name-hint.gperf"
+      {"string_view", "<string_view>", cxx17},
+#line 354 "std-name-hint.gperf"
+      {"basic_streambuf", "<streambuf>", cxx98},
 #line 180 "std-name-hint.gperf"
-      {"make_shared", "<memory>", cxx11},
-#line 44 "std-name-hint.gperf"
+      {"istreambuf_iterator", "<iterator>", cxx98},
+#line 245 "std-name-hint.gperf"
+      {"mutex", "<mutex>", cxx11},
+#line 45 "std-name-hint.gperf"
       {"make_any", "<any>", cxx17},
-#line 172 "std-name-hint.gperf"
-      {"list", "<list>", cxx98},
-#line 226 "std-name-hint.gperf"
-      {"ostringstream", "<sstream>", cxx98},
-#line 47 "std-name-hint.gperf"
-      {"to_array", "<array>", cxx20},
-#line 150 "std-name-hint.gperf"
-      {"distance", "<iterator>", cxx98},
-#line 197 "std-name-hint.gperf"
-      {"lock_guard", "<mutex>", cxx11},
-#line 111 "std-name-hint.gperf"
-      {"boolalpha", "<ios>", cxx98},
-#line 59 "std-name-hint.gperf"
-      {"strong_ordering", "<compare>", cxx20},
-#line 196 "std-name-hint.gperf"
-      {"try_lock", "<mutex>", cxx11},
-#line 267 "std-name-hint.gperf"
-      {"disjunction", "<type_traits>", cxx17},
-#line 268 "std-name-hint.gperf"
-      {"disjunction_v", "<type_traits>", cxx17},
+#line 424 "std-name-hint.gperf"
+      {"type_index", "<typeindex>", cxx11},
+#line 204 "std-name-hint.gperf"
+      {"const_pointer_cast", "<memory>", cxx11},
+#line 359 "std-name-hint.gperf"
+      {"char_traits", "<string>", cxx98},
+#line 132 "std-name-hint.gperf"
+      {"setprecision", "<iomanip>", cxx98},
+#line 203 "std-name-hint.gperf"
+      {"bad_weak_ptr", "<memory>", cxx11},
+#line 317 "std-name-hint.gperf"
+      {"spanbuf", "<spanstream>", cxx23},
+#line 414 "std-name-hint.gperf"
+      {"invoke_result", "<type_traits>", cxx17},
+#line 104 "std-name-hint.gperf"
+      {"bind", "<functional>", cxx11},
+#line 415 "std-name-hint.gperf"
+      {"invoke_result_t", "<type_traits>", cxx17},
+#line 185 "std-name-hint.gperf"
+      {"ostreambuf_iterator", "<iterator>", cxx98},
+#line 161 "std-name-hint.gperf"
+      {"cin", "<iostream>", cxx98},
+#line 436 "std-name-hint.gperf"
+      {"cmp_equal", "<utility>", cxx20},
+#line 198 "std-name-hint.gperf"
+      {"allocator", "<memory>", cxx98},
+#line 162 "std-name-hint.gperf"
+      {"clog", "<iostream>", cxx98},
+#line 441 "std-name-hint.gperf"
+      {"cmp_not_equal", "<utility>", cxx20},
+#line 291 "std-name-hint.gperf"
+      {"ranges::enable_borrowed_range", "<ranges>", cxx20},
+#line 282 "std-name-hint.gperf"
+      {"flush", "<ostream>", cxx98},
+#line 254 "std-name-hint.gperf"
+      {"bad_alloc", "<new>", cxx98},
+#line 457 "std-name-hint.gperf"
+      {"make_pair", "<utility>", cxx98},
+#line 318 "std-name-hint.gperf"
+      {"spanstream", "<spanstream>", cxx23},
 #line 67 "std-name-hint.gperf"
-      {"byte", "<cstddef>", cxx17},
-#line 115 "std-name-hint.gperf"
-      {"showpoint", "<ios>", cxx98},
-#line 64 "std-name-hint.gperf"
       {"condition_variable", "<condition_variable>", cxx11},
-#line 129 "std-name-hint.gperf"
-      {"hex", "<ios>", cxx98},
-#line 141 "std-name-hint.gperf"
-      {"wcout", "<iostream>", cxx98},
-#line 222 "std-name-hint.gperf"
-      {"basic_istringstream", "<sstream>", cxx98},
-#line 169 "std-name-hint.gperf"
-      {"noemit_on_flush", "<ostream>", cxx20},
 #line 125 "std-name-hint.gperf"
-      {"internal", "<ios>", cxx98},
-#line 140 "std-name-hint.gperf"
-      {"wcin", "<iostream>", cxx98},
-#line 234 "std-name-hint.gperf"
-      {"u8string", "<string>", cxx20},
-#line 56 "std-name-hint.gperf"
-      {"strong_equality", "<compare>", cxx20},
+      {"put_money", "<iomanip>", cxx11},
+#line 44 "std-name-hint.gperf"
+      {"any_cast", "<any>", cxx17},
+#line 468 "std-name-hint.gperf"
+      {"monostate", "<variant>", cxx17},
 #line 62 "std-name-hint.gperf"
-      {"complex_literals", "<complex>", cxx14},
-#line 194 "std-name-hint.gperf"
-      {"lock", "<mutex>", cxx11},
-#line 189 "std-name-hint.gperf"
-      {"timed_mutex", "<mutex>", cxx11},
-#line 231 "std-name-hint.gperf"
-      {"basic_string", "<string>", cxx98},
-#line 96 "std-name-hint.gperf"
+      {"weak_ordering", "<compare>", cxx20},
+#line 233 "std-name-hint.gperf"
+      {"pmr::memory_resource", "<memory_resource>", cxx17},
+#line 206 "std-name-hint.gperf"
+      {"default_delete", "<memory>", cxx11},
+#line 138 "std-name-hint.gperf"
+      {"fixed", "<ios>", cxx98},
+#line 86 "std-name-hint.gperf"
+      {"exception", "<exception>", cxx98},
+#line 192 "std-name-hint.gperf"
+      {"multimap", "<map>", cxx98},
+#line 302 "std-name-hint.gperf"
+      {"shared_lock", "<shared_mutex>", cxx14},
+#line 448 "std-name-hint.gperf"
+      {"in_place_t", "<utility>", cxx17},
+#line 445 "std-name-hint.gperf"
+      {"in_place", "<utility>", cxx17},
+#line 345 "std-name-hint.gperf"
+      {"overflow_error", "<stdexcept>", cxx98},
+#line 256 "std-name-hint.gperf"
+      {"hardware_destructive_interference_size", "<new>", cxx17},
+#line 447 "std-name-hint.gperf"
+      {"in_place_index_t", "<utility>", cxx17},
+#line 166 "std-name-hint.gperf"
+      {"wclog", "<iostream>", cxx98},
+#line 109 "std-name-hint.gperf"
+      {"invoke_r", "<functional>", cxx23},
+#line 88 "std-name-hint.gperf"
+      {"make_exception_ptr", "<exception>", cxx11},
+#line 344 "std-name-hint.gperf"
+      {"out_of_range", "<stdexcept>", cxx98},
+#line 252 "std-name-hint.gperf"
+      {"unique_lock", "<mutex>", cxx11},
+#line 244 "std-name-hint.gperf"
+      {"lock_guard", "<mutex>", cxx11},
+#line 212 "std-name-hint.gperf"
+      {"get_deleter", "<memory>", cxx11},
+#line 438 "std-name-hint.gperf"
+      {"cmp_greater_equal", "<utility>", cxx20},
+#line 464 "std-name-hint.gperf"
+      {"unreachable", "<utility>", cxx23},
+#line 135 "std-name-hint.gperf"
+      {"boolalpha", "<ios>", cxx98},
+#line 120 "std-name-hint.gperf"
       {"packaged_task", "<future>", cxx11},
+#line 443 "std-name-hint.gperf"
+      {"exchange", "<utility>", cxx14},
+#line 85 "std-name-hint.gperf"
+      {"current_exception", "<exception>", cxx11},
+#line 136 "std-name-hint.gperf"
+      {"dec", "<ios>", cxx98},
+#line 292 "std-name-hint.gperf"
+      {"ranges::enable_view", "<ranges>", cxx20},
+#line 72 "std-name-hint.gperf"
+      {"uint_fast16_t", "<cstdint>", cxx11},
 #line 239 "std-name-hint.gperf"
-      {"string_view", "<string_view>", cxx17},
-#line 225 "std-name-hint.gperf"
-      {"istringstream", "<sstream>", cxx98},
-#line 198 "std-name-hint.gperf"
-      {"unique_lock", "<mutex>", cxx11},
-#line 263 "std-name-hint.gperf"
-      {"type_identity_t", "<type_traits>", cxx20},
-#line 216 "std-name-hint.gperf"
-      {"shared_mutex", "<shared_mutex>", cxx17},
-#line 265 "std-name-hint.gperf"
+      {"pmr::synchronized_pool_resource", "<memory_resource>", cxx17},
+#line 228 "std-name-hint.gperf"
+      {"uses_allocator_v", "<memory>", cxx17},
+#line 227 "std-name-hint.gperf"
+      {"uses_allocator_construction_args", "<memory>", cxx20},
+#line 114 "std-name-hint.gperf"
+      {"unwrap_ref_decay_t", "<functional>", cxx20},
+#line 74 "std-name-hint.gperf"
+      {"uint_fast64_t", "<cstdint>", cxx11},
+#line 53 "std-name-hint.gperf"
+      {"atomic_uintmax_t", "<atomic>", cxx20},
+#line 286 "std-name-hint.gperf"
+      {"wostream", "<ostream>", cxx98},
+#line 73 "std-name-hint.gperf"
+      {"uint_fast32_t", "<cstdint>", cxx11},
+#line 320 "std-name-hint.gperf"
+      {"wospanstream", "<spanstream>", cxx23},
+#line 80 "std-name-hint.gperf"
+      {"uintmax_t", "<cstdint>", cxx11},
+#line 123 "std-name-hint.gperf"
+      {"get_money", "<iomanip>", cxx11},
+#line 52 "std-name-hint.gperf"
+      {"atomic_signed_lock_free", "<atomic>", cxx11},
+#line 246 "std-name-hint.gperf"
+      {"once_flag", "<mutex>", cxx11},
+#line 128 "std-name-hint.gperf"
+      {"resetiosflags", "<iomanip>", cxx98},
+#line 219 "std-name-hint.gperf"
+      {"pointer_traits", "<memory>", cxx11},
+#line 397 "std-name-hint.gperf"
+      {"forward_as_tuple", "<tuple>", cxx11},
+#line 248 "std-name-hint.gperf"
+      {"recursive_timed_mutex", "<mutex>", cxx11},
+#line 118 "std-name-hint.gperf"
+      {"async", "<future>", cxx11},
+#line 226 "std-name-hint.gperf"
+      {"uses_allocator", "<memory>", cxx11},
+#line 51 "std-name-hint.gperf"
+      {"atomic_ref", "<atomic>", cxx20},
+#line 127 "std-name-hint.gperf"
+      {"quoted", "<iomanip>", cxx14},
+#line 152 "std-name-hint.gperf"
+      {"scientific", "<ios>", cxx98},
+#line 50 "std-name-hint.gperf"
+      {"atomic", "<atomic>", cxx11},
+#line 408 "std-name-hint.gperf"
       {"conjunction", "<type_traits>", cxx17},
-#line 266 "std-name-hint.gperf"
+#line 255 "std-name-hint.gperf"
+      {"hardware_constructive_interference_size", "<new>", cxx17},
+#line 444 "std-name-hint.gperf"
+      {"forward", "<utility>", cxx11},
+#line 409 "std-name-hint.gperf"
       {"conjunction_v", "<type_traits>", cxx17},
-#line 217 "std-name-hint.gperf"
-      {"shared_timed_mutex", "<shared_mutex>", cxx14},
-#line 102 "std-name-hint.gperf"
-      {"setfill", "<iomanip>", cxx98},
-#line 236 "std-name-hint.gperf"
-      {"u32string", "<string>", cxx11},
-#line 235 "std-name-hint.gperf"
-      {"u16string", "<string>", cxx11},
-#line 278 "std-name-hint.gperf"
+#line 92 "std-name-hint.gperf"
+      {"expected", "<expected>", cxx23},
+#line 249 "std-name-hint.gperf"
+      {"scoped_lock", "<mutex>", cxx17},
+#line 342 "std-name-hint.gperf"
+      {"length_error", "<stdexcept>", cxx98},
+#line 87 "std-name-hint.gperf"
+      {"exception_ptr", "<exception>", cxx11},
+#line 341 "std-name-hint.gperf"
+      {"invalid_argument", "<stdexcept>", cxx98},
+#line 247 "std-name-hint.gperf"
+      {"recursive_mutex", "<mutex>", cxx11},
+#line 137 "std-name-hint.gperf"
+      {"defaultfloat", "<ios>", cxx11},
+#line 101 "std-name-hint.gperf"
+      {"ifstream", "<fstream>", cxx98},
+#line 461 "std-name-hint.gperf"
+      {"piecewise_construct", "<utility>", cxx11},
+#line 390 "std-name-hint.gperf"
+      {"system_category", "<system_error>", cxx11},
+#line 462 "std-name-hint.gperf"
+      {"piecewise_construct_t", "<utility>", cxx11},
+#line 442 "std-name-hint.gperf"
       {"declval", "<utility>", cxx11},
-#line 91 "std-name-hint.gperf"
-      {"unwrap_ref_decay", "<functional>", cxx20},
-#line 201 "std-name-hint.gperf"
-      {"make_optional", "<optional>", cxx17},
+#line 306 "std-name-hint.gperf"
+      {"source_location", "<source_location>", cxx20},
+#line 454 "std-name-hint.gperf"
+      {"integer_sequence", "<utility>", cxx14},
+#line 208 "std-name-hint.gperf"
+      {"destroy_at", "<memory>", cxx20},
+#line 294 "std-name-hint.gperf"
+      {"scoped_allocator_adaptor", "<scoped_allocator>", cxx11},
+#line 209 "std-name-hint.gperf"
+      {"destroy_n", "<memory>", cxx20},
+#line 210 "std-name-hint.gperf"
+      {"dynamic_pointer_cast", "<memory>", cxx11},
+#line 102 "std-name-hint.gperf"
+      {"ofstream", "<fstream>", cxx98},
+#line 54 "std-name-hint.gperf"
+      {"atomic_unsigned_lock_free", "<atomic>", cxx11},
+#line 319 "std-name-hint.gperf"
+      {"wispanstream", "<spanstream>", cxx23},
+#line 58 "std-name-hint.gperf"
+      {"partial_ordering", "<compare>", cxx20},
+#line 218 "std-name-hint.gperf"
+      {"owner_less", "<memory>", cxx11},
+#line 392 "std-name-hint.gperf"
+      {"jthread", "<thread>", cxx20},
+#line 215 "std-name-hint.gperf"
+      {"make_shared_for_overwrite", "<memory>", cxx20},
+#line 303 "std-name-hint.gperf"
+      {"shared_mutex", "<shared_mutex>", cxx17},
+#line 205 "std-name-hint.gperf"
+      {"construct_at", "<memory>", cxx20},
+#line 175 "std-name-hint.gperf"
+      {"distance", "<iterator>", cxx98},
+#line 304 "std-name-hint.gperf"
+      {"shared_timed_mutex", "<shared_mutex>", cxx14},
+#line 410 "std-name-hint.gperf"
+      {"disjunction", "<type_traits>", cxx17},
+#line 158 "std-name-hint.gperf"
+      {"uppercase", "<ios>", cxx98},
+#line 411 "std-name-hint.gperf"
+      {"disjunction_v", "<type_traits>", cxx17},
+#line 47 "std-name-hint.gperf"
+      {"array", "<array>", cxx11},
+#line 284 "std-name-hint.gperf"
+      {"noemit_on_flush", "<ostream>", cxx20},
+#line 65 "std-name-hint.gperf"
+      {"complex_literals", "<complex>", cxx14},
+#line 340 "std-name-hint.gperf"
+      {"domain_error", "<stdexcept>", cxx98},
 #line 200 "std-name-hint.gperf"
-      {"optional", "<optional>", cxx17},
-#line 84 "std-name-hint.gperf"
+      {"allocator_arg_t", "<memory>", cxx11},
+#line 141 "std-name-hint.gperf"
+      {"internal", "<ios>", cxx98},
+#line 75 "std-name-hint.gperf"
+      {"uint_fast8_t", "<cstdint>", cxx11},
+#line 296 "std-name-hint.gperf"
+      {"binary_semaphore", "<semaphore>", cxx20},
+#line 140 "std-name-hint.gperf"
+      {"hexfloat", "<ios>", cxx11},
+#line 107 "std-name-hint.gperf"
       {"hash", "<functional>", cxx11},
-#line 166 "std-name-hint.gperf"
-      {"flush", "<ostream>", cxx98},
-#line 206 "std-name-hint.gperf"
-      {"flush", "<ostream>", cxx98},
-#line 244 "std-name-hint.gperf"
-      {"apply", "<tuple>", cxx17},
+#line 420 "std-name-hint.gperf"
+      {"type_identity", "<type_traits>", cxx20},
+#line 197 "std-name-hint.gperf"
+      {"allocate_shared_for_overwrite", "<memory>", cxx20},
+#line 350 "std-name-hint.gperf"
+      {"stop_callback", "<stop_token>", cxx20},
+#line 139 "std-name-hint.gperf"
+      {"hex", "<ios>", cxx98},
+#line 48 "std-name-hint.gperf"
+      {"to_array", "<array>", cxx20},
+#line 380 "std-name-hint.gperf"
+      {"error_category", "<system_error>", cxx11},
+#line 440 "std-name-hint.gperf"
+      {"cmp_less_equal", "<utility>", cxx20},
+#line 43 "std-name-hint.gperf"
+      {"any", "<any>", cxx17},
+#line 68 "std-name-hint.gperf"
+      {"condition_variable_any", "<condition_variable>", cxx11},
+#line 383 "std-name-hint.gperf"
+      {"generic_category", "<system_error>", cxx11},
+#line 450 "std-name-hint.gperf"
+      {"in_place_type_t", "<utility>", cxx17},
+#line 449 "std-name-hint.gperf"
+      {"in_place_type", "<utility>", cxx17},
+#line 446 "std-name-hint.gperf"
+      {"in_place_index", "<utility>", cxx17},
+#line 467 "std-name-hint.gperf"
+      {"holds_alternative", "<variant>", cxx17},
+#line 199 "std-name-hint.gperf"
+      {"allocator_arg", "<memory>", cxx11},
+#line 90 "std-name-hint.gperf"
+      {"uncaught_exceptions", "<exception>", cxx17},
+#line 214 "std-name-hint.gperf"
+      {"make_shared", "<memory>", cxx11},
+#line 113 "std-name-hint.gperf"
+      {"unwrap_ref_decay", "<functional>", cxx20},
+#line 59 "std-name-hint.gperf"
+      {"strong_equality", "<compare>", cxx20},
+#line 202 "std-name-hint.gperf"
+      {"assume_aligned", "<memory>", cxx20},
 #line 61 "std-name-hint.gperf"
-      {"complex", "<complex>", cxx98},
-#line 242 "std-name-hint.gperf"
+      {"weak_equality", "<compare>", cxx20},
+#line 393 "std-name-hint.gperf"
       {"this_thread", "<thread>", cxx11},
-#line 177 "std-name-hint.gperf"
+#line 250 "std-name-hint.gperf"
+      {"timed_mutex", "<mutex>", cxx11},
+#line 277 "std-name-hint.gperf"
+      {"optional", "<optional>", cxx17},
+#line 196 "std-name-hint.gperf"
       {"allocate_shared", "<memory>", cxx11},
-#line 132 "std-name-hint.gperf"
-      {"scientific", "<ios>", cxx98},
-#line 192 "std-name-hint.gperf"
-      {"once_flag", "<mutex>", cxx11},
-#line 106 "std-name-hint.gperf"
-      {"put_money", "<iomanip>", cxx11},
-#line 105 "std-name-hint.gperf"
-      {"get_money", "<iomanip>", cxx11},
-#line 195 "std-name-hint.gperf"
-      {"scoped_lock", "<mutex>", cxx17},
-#line 58 "std-name-hint.gperf"
-      {"weak_ordering", "<compare>", cxx20},
-#line 55 "std-name-hint.gperf"
-      {"weak_equality", "<compare>", cxx20},
-#line 215 "std-name-hint.gperf"
-      {"shared_lock", "<shared_mutex>", cxx14},
-#line 50 "std-name-hint.gperf"
-      {"atomic_flag", "<atomic>", cxx11},
-#line 142 "std-name-hint.gperf"
-      {"wclog", "<iostream>", cxx98},
-#line 65 "std-name-hint.gperf"
-      {"condition_variable_any", "<condition_variable>", cxx11},
-#line 139 "std-name-hint.gperf"
-      {"clog", "<iostream>", cxx98},
-#line 262 "std-name-hint.gperf"
-      {"type_identity", "<type_traits>", cxx20},
-#line 233 "std-name-hint.gperf"
-      {"wstring", "<string>", cxx98},
-#line 57 "std-name-hint.gperf"
-      {"partial_ordering", "<compare>", cxx20}
+#line 207 "std-name-hint.gperf"
+      {"destroy", "<memory>", cxx20},
+#line 396 "std-name-hint.gperf"
+      {"apply", "<tuple>", cxx17},
+#line 64 "std-name-hint.gperf"
+      {"complex", "<complex>", cxx98},
+#line 143 "std-name-hint.gperf"
+      {"noboolalpha", "<ios>", cxx98
     };
 
   static const short lookup[] =
     {
         -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,    0,   -1,   -1,   -1,    1,   -1,    2,
-        -1,    3,   -1, -228,   -1,    6, -201,   -2,
-        -1,    7,    8,   -1,    9,   -1,   -1,   -1,
-        -1,   -1,   -1,   10,   11,   -1,   -1,   12,
-        -1,   13,   -1,   14,   15,   -1,   16,   -1,
-        17,   -1,   -1,   18,   19,   20,   -1,   21,
-        -1,   22,   -1,   -1,   23,   24, -287,   -1,
-        27,   28,   29,   30,   31,   -1,   32,   -1,
-        33,   34,   35,   36,   37,   -1,   38,   -1,
-        39, -180,   -2,   -1,   -1,   -1,   40,   -1,
-        41,   -1,   -1,   -1,   -1,   42,   43,   -1,
-        44,   45,   46,   -1,   47,   -1,   48,   49,
-        50,   51,   52,   53,   -1,   -1,   54,   -1,
-        -1,   55,   56,   57,   58,   -1,   59,   -1,
-        60,   61,   -1,   62,   -1,   63,   64,   -1,
-        65,   -1,   -1,   -1,   66,   -1,   -1,   67,
-        68,   69,   70,   -1,   -1,   71,   -1,   -1,
-        72,   -1,   73,   -1,   -1,   74,   75,   -1,
-        -1,   76,   -1,   77,   78,   79,   -1,   80,
-        81,   -1,   -1,   -1,   -1,   82,   -1,   -1,
-        83,   -1,   -1,   84,   -1,   85,   86,   87,
-        -1,   88,   89,   -1,   90,   -1,   -1,   91,
-        92,   93,   -1,   94,   95,   96,   -1,   97,
-      -403,  100,  101,   -1,  102, -107,   -2,  103,
-        -1,   -1,   -1,  104,  105,  106,  107,   -1,
-        -1,   -1,   -1,  108,   -1,  109,  110,  111,
-       112,  113,  114,  115,   -1,   -1,  116,  117,
-        -1,   -1,   -1,  118,  119,  120,   -1,   -1,
-        -1,   -1,  121,   -1,  122,   -1,  123,  124,
-       125,  126,   -1,  127,  128,   -1,   -1,   -1,
-       129,   -1,   -1,   -1,   -1,  130,  131,   -1,
-        -1,   -1,  132,   -1,  133,   -1,  134,  135,
-       136,   -1,   -1,   -1,  137,   -1,  138,   -1,
-        -1,  139,   -1,   -1,  140,  141,   -1,   -1,
-        -1,   -1,  142,  143,   -1,   -1,   -1,  144,
-       145,   -1,   -1,   -1,   -1,  146,  147,  148,
-        -1,   -1,  149,   -1,   -1,  150,  151,  152,
-       153,   -1,   -1,  154,  155,   -1,   -1,   -1,
-        -1,  156,  157,  158,  159,  160,  161,   -1,
-        -1,   -1,   -1,   -1,  162,   -1,   -1,   -1,
-        -1,   -1,   -1,  163,  164,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,  165,  166,  167,   -1,   -1,   -1,
-       168,  169,   -1,   -1,  170,   -1,   -1,  171,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,  172,   -1,   -1,   -1,
-       173,  174,  175,   -1,   -1,   -1,   -1,  176,
-       177,   -1,   -1,   -1,   -1,  178,   -1,   -1,
-        -1,  179,   -1,  180,   -1,   -1,   -1,   -1,
-        -1,  181,   -1,   -1,   -1,   -1,  182,   -1,
-        -1,  183,   -1,   -1,   -1, -620,  -21,   -2,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-       186,   -1,   -1,  187,   -1,   -1,   -1,  188,
-        -1,  189,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,  190,   -1,  191,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,  192,
-        -1,   -1,   -1,   -1,  193,   -1,   -1,  194,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,  195,   -1,   -1,   -1,  196,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-       197,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,  198,   -1,   -1,   -1,   -1,
-        -1,   -1,  199,   -1,  200,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,  201,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,  202,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,  203,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-        -1,   -1,  204
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,    0,   -1,    1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,    2,   -1,    3,    4,   -1,
+         5,   -1,   -1,    6,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,    7,   -1,   -1,    8,   -1,
+        -1,   -1,   -1,    9,   10,   -1,   11,   12,
+        13,   14,   15,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   16,   -1,   -1,   17,   18,   -1,
+        19,   20,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   21,   22,   23,   -1,   -1, -474, -354,
+        -2,   -1,   -1,   -1,   -1,   26,   -1,   -1,
+        -1,   27,   28,   -1,   29,   -1,   30,   -1,
+        31,   -1,   -1,   32,   33,   -1,   34,   -1,
+        35,   36,   -1,   -1,   37,   38,   39,   40,
+        -1,   41,   -1,   42,   -1,   43,   -1,   -1,
+        44,   -1,   45,   46,   47,   -1,   -1,   -1,
+        48,   -1,   -1,   49,   50,   51, -530, -326,
+        -2,   54,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   55,   56,   -1,   57,   -1,   -1,   -1,
+        58,   59,   60,   -1,   -1,   61,   -1,   -1,
+        -1,   -1,   62,   -1,   -1,   63,   -1,   64,
+        -1,   65,   -1,   -1,   66,   67,   -1,   68,
+        -1,   -1,   69,   -1,   -1,   70,   71,   -1,
+        -1,   -1,   72,   -1,   -1,   73,   -1,   -1,
+        -1,   74,   -1,   75,   76,   -1,   -1,   -1,
+        77,   -1,   -1,   78,   -1,   79,   -1,   -1,
+        -1,   -1,   80,   81,   82,   83,   -1,   84,
+        85,   -1,   -1,   -1, -649,   -1,   88,   89,
+        90,   91,   -1,   92,   93, -637,   96,   97,
+        98,   99,  100,  101,   -1,  102,   -1,  103,
+        -1,  104, -284,   -2,  105,  106,  107,   -1,
+       108,   -1,  109,   -1,  110,  111, -292,   -2,
+       112,  113,  114,   -1,   -1,   -1,   -1,  115,
+        -1,  116,  117,   -1,  118,   -1,  119,   -1,
+       120,   -1,   -1,  121,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  122,   -1,   -1,   -1,   -1,
+       123,   -1,   -1,  124,   -1,  125,   -1,  126,
+       127,   -1,   -1,   -1,  128,   -1,  129,   -1,
+        -1,   -1,   -1,   -1,  130,  131,   -1,   -1,
+        -1,   -1,  132,   -1,   -1,   -1,  133,   -1,
+        -1,  134,   -1,   -1,   -1,   -1,   -1,   -1,
+       135,   -1,  136,  137,  138,  139,  140,   -1,
+        -1,   -1,  141,   -1,   -1,  142,   -1,   -1,
+        -1,   -1,  143,   -1,   -1,  144,   -1,  145,
+        -1,  146,  147,  148,   -1,   -1,   -1,   -1,
+        -1,   -1,  149,  150,   -1,   -1,   -1,  151,
+        -1,   -1,   -1,  152,   -1,  153,   -1, -775,
+        -1,  156,   -1,  157, -224,   -2,  158,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  159,   -1,   -1,
+        -1,  160,  161,  162,   -1,  163,   -1,  164,
+        -1,   -1,   -1,   -1,   -1,   -1,  165,  166,
+       167,   -1,  168,  169,  170,  171,  172,  173,
+        -1,  174,  175,  176,   -1,   -1,  177,   -1,
+       178,   -1,  179,  180,  181,   -1,  182,  183,
+        -1,   -1,   -1,   -1,   -1,  184,   -1,  185,
+        -1,  186,   -1,  187,  188,  189,  190,   -1,
+       191,   -1,   -1,  192,  193,   -1,  194,  195,
+        -1,   -1,  196,   -1,  197,  198,   -1,   -1,
+        -1,   -1,  199,  200,   -1,  201,   -1,  202,
+      -876, -175,   -2,  205,   -1,  206,   -1,  207,
+       208,   -1,   -1,   -1,  209,   -1,  210,   -1,
+       211,  212,  213,   -1,  214,  215,  216,  217,
+       218,   -1,   -1,   -1,   -1,   -1,   -1,  219,
+        -1,  220,   -1,  221,   -1,  222,  223,  224,
+        -1,   -1,   -1,  225,  226,  227,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  228,  229,
+        -1,   -1,  230,  231,   -1,  232,   -1,   -1,
+        -1,   -1,  233,  234,  235,  236,   -1,   -1,
+        -1,  237,   -1,  238,  239,   -1,  240,  241,
+       242,   -1,   -1,  243,   -1,   -1,   -1,   -1,
+        -1,  244,   -1,  245,   -1,  246,  247,  248,
+        -1,   -1,   -1,   -1,   -1,  249,  250,  251,
+       252,   -1,   -1,  253,  254,  255,   -1,  256,
+       257,   -1,   -1,  258,   -1,  259,   -1,   -1,
+       260,   -1,  261,   -1,   -1,   -1,   -1,  262,
+       263,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       264,  265,   -1,   -1,   -1,   -1,  266,   -1,
+        -1,   -1,   -1,   -1,   -1,  267,  268,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  269,
+        -1,   -1,   -1,  270,  271,  272,   -1,   -1,
+       273,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  274,   -1,   -1,   -1,   -1,   -1,  275,
+        -1,   -1,   -1,  276,   -1,   -1,  277,   -1,
+       278,   -1,   -1,   -1,   -1,  279,  280,   -1,
+       281,   -1,   -1,   -1,   -1,   -1,  282,  283,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  284,   -1,   -1,  285,  286,  287,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  288,   -1,
+        -1,  289,  290,   -1,   -1,  291,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  292,  293,
+       294,   -1,  295,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,  296,   -1,  297,   -1,
+        -1,   -1,   -1,   -1,  298,  299,  300,   -1,
+       301,  302,   -1,   -1,  303,   -1,  304,   -1,
+        -1,  305,   -1,   -1,   -1,   -1,   -1,   -1,
+       306,   -1,  307,   -1,   -1,   -1,   -1,  308,
+       309,   -1,   -1,   -1,  310,   -1,   -1,  311,
+       312,   -1,  313,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  314,  315,  316,  317,   -1,
+        -1,  318,   -1,   -1,  319,   -1,   -1,   -1,
+        -1,   -1,  320,   -1,   -1,   -1,   -1,   -1,
+        -1,  321,  322,   -1,   -1,  323,  324,   -1,
+        -1,  325,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  326,
+        -1,   -1,   -1,   -1,   -1,  327,   -1,   -1,
+       328,  329,   -1,  330,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  331,   -1,  332,   -1,   -1,
+       333,  334,   -1,  335,   -1,   -1,   -1,   -1,
+        -1,  336,   -1,   -1,   -1,   -1,  337,   -1,
+        -1,   -1,   -1,   -1,   -1,  338,   -1,  339,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  340,   -1,   -1,   -1,  341,
+        -1,   -1,  342,   -1,   -1,  343,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  344,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+       345,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  346,   -1,
+       347,  348,   -1,  349,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  350,   -1,   -1,
+        -1,  351,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  352,   -1,   -1,  353,   -1,
+       354,   -1,   -1,   -1,  355,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  356,   -1,  357,   -1,  358,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  359,   -1,   -1,  360,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,  361,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  362,   -1,   -1,
+        -1,  363,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,  364,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  365,   -1,   -1,  366,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  367,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  368,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,  369,  370,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,  371,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,  372,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  373,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,  374,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,  375,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,  376,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+        -1,   -1,   -1,  377
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
@@ -653,7 +1097,7 @@ std_name_hint_lookup::find (const char *str, size_t len)
 
               if (*str == *s && !strcmp (str + 1, s + 1))
                 return &wordlist[index];
-            }
+            
           else if (index < -TOTAL_KEYWORDS)
             {
               int offset = - 1 - TOTAL_KEYWORDS - index;
@@ -667,9 +1111,9 @@ std_name_hint_lookup::find (const char *str, size_t len)
                   if (*str == *s && !strcmp (str + 1, s + 1))
                     return wordptr;
                   wordptr++;
-                }
-            }
-        }
-    }
+                
+            
+        
+    
   return 0;
-}
+
--- /dev/null	2022-09-07 09:53:26.084773798 +0200
+++ b/gcc/cp/cxxapi-data.csv	2022-09-12 09:15:13.935243403 +0200
@@ -0,0 +1,1016 @@
+# C++ API data.
+#
+# Copyright (C) 2022 Free Software Foundation
+# This file is part of GCC.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+#
+# This file can be processed with gen-cxxapi-file.py to create the
+# export list for the standard C++ library module and the tables for
+# suggesting actions on missing symbols in the std:: namespace.
+#
+<algorithm>,ranges::in_fun_result,1,no
+<algorithm>,ranges::in_in_result,1,no
+<algorithm>,ranges::in_out_result,1,no
+<algorithm>,ranges::in_in_out_result,1,no
+<algorithm>,ranges::in_out_out_result,1,no
+<algorithm>,ranges::min_max_result,1,no
+<algorithm>,ranges::in_found_result,1,no
+# unimplemented <algorithm>,ranges::out_value_result,1,no
+<algorithm>,all_of,1,no
+# c++/106851 <algorithm>,ranges::all_of,1,no
+<algorithm>,any_of,1,no
+# c++/106851 <algorithm>,ranges::any_of,1,no
+<algorithm>,none_of,1,no
+# c++/106851 <algorithm>,ranges::none_of,1,no
+<algorithm>,for_each,1,no
+<algorithm>,ranges::for_each_result,1,no
+# c++/106851 <algorithm>,ranges::for_each,1,no
+<algorithm>,for_each_n,1,no
+<algorithm>,ranges::for_each_n_result,1,no
+# c++/106851 <algorithm>,ranges::for_each_n,1,no
+<algorithm>,find,1,no
+<algorithm>,find_if,1,no
+<algorithm>,find_if_not,1,no
+# c++/106851 <algorithm>,ranges::find,1,no
+# c++/106851 <algorithm>,ranges::find_if,1,no
+# c++/106851 <algorithm>,ranges::find_if_not,1,no
+<algorithm>,find_end,1,no
+# c++/106851 <algorithm>,ranges::find_end,1,no
+<algorithm>,find_first_of,1,no
+# c++/106851 <algorithm>,ranges::find_first_of,1,no
+<algorithm>,adjacent_find,1,no
+# c++/106851 <algorithm>,ranges::adjacent_find,1,no
+<algorithm>,count,1,no
+<algorithm>,count_if,1,no
+# c++/106851 <algorithm>,ranges::count,1,no
+# c++/106851 <algorithm>,ranges::count_if,1,no
+<algorithm>,mismatch,1,no
+<algorithm>,ranges::mismatch_result,1,no
+# c++/106851 <algorithm>,ranges::mismatch,1,no
+<algorithm>,equal,1,no
+# c++/106851 <algorithm>,ranges::equal,1,no
+<algorithm>,is_permutation,1,no
+# c++/106851 <algorithm>,ranges::is_permutation,1,no
+<algorithm>,search,1,no
+# c++/106851 <algorithm>,ranges::search,1,no
+<algorithm>,search_n,1,no
+# c++/106851 <algorithm>,ranges::search_n,1,no
+# unimplemented <algorithm>,ranges::starts_with,1,no
+# unimplemented <algorithm>,ranges::ends_with,1,no
+<algorithm>,copy,1,no
+<algorithm>,ranges::copy_result,1,no
+# c++/106851 <algorithm>,ranges::copy,1,no
+<algorithm>,copy_n,1,no
+<algorithm>,ranges::copy_n_result,1,no
+# c++/106851 <algorithm>,ranges::copy_n,1,no
+<algorithm>,copy_if,1,no
+<algorithm>,ranges::copy_if_result,1,no
+# c++/106851 <algorithm>,ranges::copy_if,1,no
+<algorithm>,copy_backward,1,no
+<algorithm>,ranges::copy_backward_result,1,no
+# c++/106851 <algorithm>,ranges::copy_backward,1,no
+<algorithm>,move,1,no
+<algorithm>,ranges::move_result,1,no
+# c++/106851 <algorithm>,ranges::move,1,no
+<algorithm>,move_backward,1,no
+<algorithm>,ranges::move_backward_result,1,no
+# c++/106851 <algorithm>,ranges::move_backward,1,no
+# <algorithm> TODO the rest
+<any>,bad_any_cast,1,no
+<any>,any,1,cxx17
+<any>,swap,1,no
+<any>,make_any,1,cxx17
+<any>,any_cast,1,cxx17
+<array>,array,1,cxx11
+<array>,operator==,1,no
+<array>,operator<=>,1,no
+<array>,swap,1,no
+<array>,to_array,1,cxx20
+<array>,tuple_size,1,no
+<array>,tuple_element,1,no
+<array>,get,1,no
+<atomic>,memory_order,1,no
+<atomic>,kill_dependency,1,no
+<atomic>,atomic_ref,1,cxx20
+<atomic>,atomic,1,cxx11
+<atomic>,atomic_is_lock_free,1,no
+<atomic>,atomic_store,1,no
+<atomic>,atomic_store_explicit,1,no
+<atomic>,atomic_load,1,no
+<atomic>,atomic_load_explicit,1,no
+<atomic>,atomic_exchange,1,no
+<atomic>,atomic_exchange_explicit,1,no
+<atomic>,atomic_compare_exchange_weak,1,no
+<atomic>,atomic_compare_exchange_strong,1,no
+<atomic>,atomic_compare_exchange_weak_explicit,1,no
+<atomic>,atomic_compare_exchange_strong_explicit,1,no
+<atomic>,atomic_fetch_add,1,no
+<atomic>,atomic_fetch_add_explicit,1,no
+<atomic>,atomic_fetch_sub,1,no
+<atomic>,atomic_fetch_sub_explicit,1,no
+<atomic>,atomic_fetch_and,1,no
+<atomic>,atomic_fetch_and_explicit,1,no
+<atomic>,atomic_fetch_or,1,no
+<atomic>,atomic_fetch_or_explicit,1,no
+<atomic>,atomic_fetch_xor,1,no
+<atomic>,atomic_fetch_xor_explicit,1,no
+<atomic>,atomic_wait,1,no
+<atomic>,atomic_wait_explicit,1,no
+<atomic>,atomic_notify_one,1,no
+<atomic>,atomic_notify_all,1,no
+<atomic>,atomic_notify_all,1,no
+<atomic>,atomic_bool,1,no
+<atomic>,atomic_char,1,no
+<atomic>,atomic_schar,1,no
+<atomic>,atomic_uchar,1,no
+<atomic>,atomic_short,1,no
+<atomic>,atomic_ushort,1,no
+<atomic>,atomic_int,1,no
+<atomic>,atomic_uint,1,no
+<atomic>,atomic_long,1,no
+<atomic>,atomic_ulong,1,no
+<atomic>,atomic_llong,1,no
+<atomic>,atomic_ullong,1,no
+<atomic>,atomic_char8_t,1,no
+<atomic>,atomic_char16_t,1,no
+<atomic>,atomic_char32_t,1,no
+<atomic>,atomic_wchar_t,1,no
+<atomic>,atomic_int8_t,1,no
+<atomic>,atomic_uint8_t,1,no
+<atomic>,atomic_int16_t,1,no
+<atomic>,atomic_uint16_t,1,no
+<atomic>,atomic_int32_t,1,no
+<atomic>,atomic_uint32_t,1,no
+<atomic>,atomic_int64_t,1,no
+<atomic>,atomic_uint64_t,1,no
+<atomic>,atomic_int_least8_t,1,no
+<atomic>,atomic_uint_least8_t,1,no
+<atomic>,atomic_int_least16_t,1,no
+<atomic>,atomic_uint_least16_t,1,no
+<atomic>,atomic_int_least32_t,1,no
+<atomic>,atomic_uint_least32_t,1,no
+<atomic>,atomic_int_least64_t,1,no
+<atomic>,atomic_uint_least64_t,1,no
+<atomic>,atomic_int_fast8_t,1,no
+<atomic>,atomic_uint_fast8_t,1,no
+<atomic>,atomic_int_fast16_t,1,no
+<atomic>,atomic_uint_fast16_t,1,no
+<atomic>,atomic_int_fast32_t,1,no
+<atomic>,atomic_uint_fast32_t,1,no
+<atomic>,atomic_int_fast64_t,1,no
+<atomic>,atomic_uint_fast64_t,1,no
+<atomic>,atomic_intptr_t,1,no
+<atomic>,atomic_uintptr_t,1,no
+<atomic>,atomic_size_t,1,no
+<atomic>,atomic_ptrdiff_t,1,no
+<atomic>,atomic_intmax_t,1,no
+<atomic>,atomic_uintmax_t,1,no
+<atomic>,atomic_uintmax_t,1,cxx20
+<atomic>,atomic_signed_lock_free,1,cxx11,__cpp_lib_atomic_lock_free_type_aliases
+<atomic>,atomic_unsigned_lock_free,1,cxx11,__cpp_lib_atomic_lock_free_type_aliases
+# libstdc++/103934 <atomic>,atomic_flag_test,1,no
+# libstdc++/103934 <atomic>,atomic_flag_test_explicit,1,no
+<atomic>,atomic_flag_test_and_set,1,no
+<atomic>,atomic_flag_test_and_set_explicit,1,no
+<atomic>,atomic_flag_clear,1,no
+<atomic>,atomic_flag_clear_explicit,1,no
+# libstdc++/103934 <atomic>,atomic_flag_wait,1,no
+# libstdc++/103934 <atomic>,atomic_flag_wait_explicit,1,no
+# libstdc++/103934 <atomic>,atomic_flag_notify_one,1,no
+# libstdc++/103934 <atomic>,atomic_flag_notify_all,1,no
+<atomic>,atomic_thread_fence,1,no
+<atomic>,atomic_signal_fence,1,no
+<barrier>,barrier,1,no
+<bit>,bit_cast,1,no
+<bit>,byteswap,1,no
+<bit>,has_single_bit,1,no
+<bit>,bit_ceil,1,no
+<bit>,bit_floor,1,no
+<bit>,bit_width,1,no
+<bit>,rotl,1,no
+<bit>,rotr,1,no
+<bit>,countl_zero,1,no
+<bit>,countl_one,1,no
+<bit>,countr_zero,1,no
+<bit>,countr_one,1,no
+<bit>,popcount,1,no
+<bit>,endian,1,no
+<bit>,endian::little,1,no
+<bit>,endian::big,1,no
+<bit>,endian::native,1,no
+<bitset>,bitset,1,cxx11
+<bitset>,operator&,1,no
+<bitset>,operator|,1,no
+<bitset>,operator^,1,no
+<bitset>,operator>>,1,no
+<bitset>,operator<<,1,no
+<charconv>,chars_format,1,no
+<charconv>,to_chars_result,1,no
+<charconv>,to_chars,1,no
+<charconv>,from_chars_result,1,no
+<charconv>,from_chars,1,no
+# <chrono> TODO
+# <codecvt> TODO
+<compare>,weak_equality,1,cxx20
+<compare>,strong_equality,1,cxx20
+<compare>,partial_ordering,1,cxx20
+<compare>,weak_ordering,1,cxx20
+<compare>,strong_ordering,1,cxx20
+# <compare> TODO the rest
+<complex>,complex,1,cxx98
+<complex>,complex_literals,0,cxx14
+# <complex> TODO the rest
+# <concepts> TODO
+<condition_variable>,condition_variable,1,cxx11
+<condition_variable>,condition_variable_any,1,cxx11
+<condition_variable>,notify_all_at_thread_exit,1,no
+<condition_variable>,cv_status,1,no
+<condition_variable>,cv_status::no_timeout,1,no
+<condition_variable>,cv_status::timeout,1,no
+<coroutine>,coroutine_traits,1,no
+<coroutine>,coroutine_handle,1,no
+<coroutine>,operator==,1,no
+<coroutine>,operator<=>,1,no
+<coroutine>,hash,1,no
+<coroutine>,noop_coroutine_promise,1,no
+<coroutine>,noop_coroutine_handle,1,no
+<coroutine>,noop_coroutine,1,no
+<coroutine>,suspend_never,1,no
+<coroutine>,suspend_always,1,no
+<cstddef>,byte,0,cxx17
+<deque>,deque,1,cxx98
+<deque>,operator==,1,no
+<deque>,operator<=>,1,no
+<deque>,swap,1,no
+<deque>,erase,1,no
+<deque>,erase_if,1,no
+# c++/106851 <deque>,pmr::deque,1,no
+# <exception> TODO
+<exception>,exception,1,cxx98
+<exception>,bad_exception,1,no
+<exception>,nested_exception,1,no
+<exception>,terminate_handler,1,no
+<exception>,get_terminate,1,no
+<exception>,set_terminate,1,no
+<exception>,terminate,1,cxx98
+<exception>,uncaught_exceptions,1,cxx17
+<exception>,exception_ptr,1,cxx11
+<exception>,current_exception,1,cxx11
+<exception>,rethrow_exception,1,no
+<exception>,make_exception_ptr,1,cxx11
+<exception>,throw_with_nested,1,no
+<exception>,rethrow_if_nested,1,no
+<expected>,unexpected,1,no
+<expected>,bad_expected_access,1,no
+<expected>,unexpect_t,1,no
+<expected>,unexpect,1,no
+<expected>,expected,1,cxx23
+# <filesystem> TODO
+# <flat_map>,flat_map,1,no
+# <flat_map>,flat_multimap,1,no
+# <flat_map>,sorted_unique_t,1,no
+# <flat_map>,sorted_unique,1,no
+# <flat_map>,sorted_equivalent_t,1,no
+# <flat_map>,sorted_equivalent,1,no
+# <flat_map>,erase_if,1,no
+# <flat_map>,uses_allocator,1,no
+# <flat_set>,flat_set,1,no
+# <flat_set>,flat_multiset,1,no
+# <flat_set>,sorted_unique_t,1,no
+# <flat_set>,sorted_unique,1,no
+# <flat_set>,sorted_equivalent_t,1,no
+# <flat_set>,sorted_equivalent,1,no
+# <flat_set>,erase_if,1,no
+# <flat_set>,uses_allocator,1,no
+<forward_list>,forward_list,1,cxx11
+<forward_list>,operator==,1,no
+<forward_list>,operator<=>,1,no
+<forward_list>,swap,1,no
+<forward_list>,erase,1,no
+<forward_list>,erase_if,1,no
+# c++/106851 <forward_list>,pmr::forward_list,1,no
+<fstream>,basic_filebuf,1,no
+<fstream>,swap,1,no
+<fstream>,basic_filebuf,0,cxx98
+<fstream>,filebuf,1,no
+<fstream>,wfilebuf,1,no
+<fstream>,basic_ifstream,1,cxx98
+<fstream>,ifstream,1,no
+<fstream>,wifstream,1,no
+<fstream>,basic_ofstream,1,cxx98
+<fstream>,ofstream,1,cxx98
+<fstream>,wofstream,1,no
+<fstream>,basic_fstream,1,cxx98
+<fstream>,fstream,1,cxx98
+<fstream>,ifstream,1,cxx98
+<functional>,bind,1,cxx11
+<functional>,bind_front,1,cxx20
+<functional>,function,1,cxx11
+<functional>,hash,0,cxx11
+<functional>,invoke,1,cxx17
+<functional>,invoke_r,1,cxx23
+<functional>,mem_fn,1,cxx11
+<functional>,not_fn,1,cxx17
+<functional>,reference_wrapper,1,cxx11
+<functional>,unwrap_reference,1,cxx20
+<functional>,unwrap_reference_t,1,cxx20
+<functional>,unwrap_ref_decay,1,cxx20
+<functional>,unwrap_ref_decay_t,1,cxx20
+# <functional> TODO the rest
+<future>,future_errc,1,no
+<future>,launch,1,no
+<future>,future_status,1,no
+<future>,is_error_code_enum,1,no
+<future>,make_error_code,1,no
+<future>,make_error_condition,1,no
+<future>,future_category,1,no
+<future>,future_error,1,no
+<future>,promise,1,cxx11
+<future>,swap,1,no
+<future>,uses_allocator,1,no
+<future>,future,1,cxx11
+<future>,shared_future,1,no
+<future>,packaged_task,1,cxx11
+<future>,async,1,cxx11
+<initializer_list>,initializer_list,1,no
+<initializer_list>,begin,1,no
+<initializer_list>,end,1,no
+<iomanip>,resetiosflags,1,cxx98
+<iomanip>,setiosflags,1,cxx98
+<iomanip>,setbase,1,cxx98
+<iomanip>,setfill,1,cxx98
+<iomanip>,setprecision,1,cxx98
+<iomanip>,setw,1,cxx98
+<iomanip>,get_money,1,cxx11
+<iomanip>,put_money,1,cxx11
+<iomanip>,get_time,1,cxx11
+<iomanip>,put_time,1,cxx11
+<iomanip>,quoted,1,cxx14
+<ios>,boolalpha,0,cxx98
+<ios>,noboolalpha,0,cxx98
+<ios>,showbase,0,cxx98
+<ios>,noshowbase,0,cxx98
+<ios>,showpoint,0,cxx98
+<ios>,noshowpoint,0,cxx98
+<ios>,showpos,0,cxx98
+<ios>,noshowpos,0,cxx98
+<ios>,skipws,0,cxx98
+<ios>,noskipws,0,cxx98
+<ios>,uppercase,0,cxx98
+<ios>,nouppercase,0,cxx98
+<ios>,unitbuf,0,cxx98
+<ios>,nounitbuf,0,cxx98
+<ios>,internal,0,cxx98
+<ios>,left,0,cxx98
+<ios>,right,0,cxx98
+<ios>,dec,0,cxx98
+<ios>,hex,0,cxx98
+<ios>,oct,0,cxx98
+<ios>,fixed,0,cxx98
+<ios>,scientific,0,cxx98
+<ios>,hexfloat,0,cxx11
+<ios>,defaultfloat,0,cxx11
+# <ios> TODO the rest
+# <iosfwd> TODO ?
+<iostream>,cin,1,cxx98
+<iostream>,cout,1,cxx98
+<iostream>,cerr,1,cxx98
+<iostream>,clog,1,cxx98
+<iostream>,wcin,1,cxx98
+<iostream>,wcout,1,cxx98
+<iostream>,wcerr,1,cxx98
+<iostream>,wclog,1,cxx98
+<istream>,basic_istream,1,no
+<istream>,istream,1,cxx98
+<istream>,wistream,1,no
+<istream>,basic_iostream,1,no
+<istream>,iostream,1,no
+<istream>,wiostream,1,no
+<istream>,ws,1,cxx98
+<istream>,operator>>,1,no
+<iterator>,advance,1,cxx98
+<iterator>,back_inserter,1,cxx98
+<iterator>,begin,1,cxx11
+<iterator>,distance,1,cxx98
+<iterator>,end,1,cxx11
+<iterator>,front_inserter,1,cxx98
+<iterator>,inserter,1,cxx98
+<iterator>,istream_iterator,1,cxx98
+<iterator>,istreambuf_iterator,1,cxx98
+<iterator>,iterator_traits,1,cxx98
+<iterator>,move_iterator,1,cxx11
+<iterator>,next,1,cxx11
+<iterator>,ostream_iterator,1,cxx98
+<iterator>,ostreambuf_iterator,1,cxx98
+<iterator>,prev,1,cxx11
+<iterator>,reverse_iterator,1,cxx98
+# <iterator> TODO the rest
+<latch>,latch,1,no
+<list>,list,1,cxx98
+<list>,operator==,1,no
+<list>,operator<=>,1,no
+<list>,swap,1,no
+<list>,erase,1,no
+<list>,erase_if,1,no
+# c++/106851 <list>,pmr::list,1,no
+# <locale> TODO
+<map>,map,1,cxx98
+<map>,multimap,1,cxx98
+<map>,operator==,1,no
+<map>,operator<=>,1,no
+<map>,swap,1,no
+<map>,erase,1,no
+<map>,erase_if,1,no
+# c++/106851 <map>,pmr::map,1,no
+# c++/106851 <map>,pmr::multimap,1,no
+# unimplemented <mdspan>,extents,1,no
+# unimplemented <mdspan>,dextents,1,no
+# unimplemented <mdspan>,layout_left,1,no
+# unimplemented <mdspan>,layout_right,1,no
+# unimplemented <mdspan>,layout_stride,1,no
+# unimplemented <mdspan>,default_accessor,1,no
+# unimplemented <mdspan>,mdspan,1,cxx23
+<memory>,pointer_traits,1,cxx11
+<memory>,to_address,1,cxx11
+<memory>,align,1,cxx11
+<memory>,assume_aligned,1,cxx20
+<memory>,allocator_arg_t,1,cxx11
+<memory>,allocator_arg,1,cxx11
+<memory>,uses_allocator,1,cxx11
+<memory>,uses_allocator_v,1,cxx17
+<memory>,uses_allocator_construction_args,1,cxx20
+<memory>,make_obj_using_allocator,1,cxx20
+<memory>,uninitialized_construct_using_allocator,1,cxx20
+<memory>,allocator_traits,1,cxx11
+<memory>,allocator,1,cxx98
+<memory>,operator==,1,no
+<memory>,addressof,1,cxx11
+# TODO uninitialized memory algos
+<memory>,construct_at,1,cxx20
+# c++/106851 <memory>,ranges::construct_at,1,cxx20
+<memory>,destroy_at,1,cxx20
+<memory>,destroy,1,cxx20
+<memory>,destroy_n,1,cxx20
+# c++/106851 <memory>,ranges::destroy_at,1,cxx20
+# c++/106851 <memory>,ranges::destroy,1,cxx20
+# c++/106851 <memory>,ranges::destroy_n,1,cxx20
+<memory>,default_delete,1,cxx11
+<memory>,unique_ptr,1,cxx11
+<memory>,make_unique,1,cxx14
+<memory>,make_unique_for_overwrite,1,cxx20
+<memory>,swap,1,no
+<memory>,operator==,1,no
+<memory>,operator<=>,1,no
+<memory>,operator>,1,no
+<memory>,operator<=,1,no
+<memory>,operator>=,1,no
+<memory>,operator<=>,1,no
+<memory>,operator<<,1,no
+<memory>,bad_weak_ptr,1,cxx11
+<memory>,shared_ptr,1,cxx11
+<memory>,make_shared,1,cxx11
+<memory>,allocate_shared,1,cxx11
+<memory>,make_shared_for_overwrite,1,cxx20
+<memory>,allocate_shared_for_overwrite,1,cxx20
+<memory>,get_deleter,1,cxx11
+<memory>,static_pointer_cast,1,cxx11
+<memory>,dynamic_pointer_cast,1,cxx11
+<memory>,const_pointer_cast,1,cxx11
+<memory>,reinterpret_pointer_cast,1,cxx17
+<memory>,weak_ptr,1,cxx11
+<memory>,owner_less,1,cxx11
+<memory>,enable_shared_from_this,1,cxx11
+<memory>,hash,1,no
+<memory_resource>,pmr,0,cxx17
+<memory_resource>,pmr::memory_resource,1,cxx17
+<memory_resource>,pmr::operator==,1,no
+<memory_resource>,pmr::polymorphic_allocator,1,cxx17
+<memory_resource>,pmr::new_delete_resource,1,cxx17
+<memory_resource>,pmr::set_default_resource,1,cxx17
+<memory_resource>,pmr::get_default_resource,1,cxx17
+<memory_resource>,pmr::pool_options,1,cxx17
+<memory_resource>,pmr::synchronized_pool_resource,1,cxx17
+<memory_resource>,pmr::unsynchronized_pool_resource,1,cxx17
+<memory_resource>,pmr::monotonic_buffer_resource,1,cxx17
+<mutex>,mutex,1,cxx11
+<mutex>,recursive_mutex,1,cxx11
+<mutex>,timed_mutex,1,cxx11
+<mutex>,recursive_timed_mutex,1,cxx11
+<mutex>,defer_lock_t,1,no
+<mutex>,try_to_lock_t,1,no
+<mutex>,adopt_lock_t,1,no
+<mutex>,defer_lock,1,no
+<mutex>,try_to_lock,1,no
+<mutex>,adopt_lock,1,no
+<mutex>,lock_guard,1,cxx11
+<mutex>,scoped_lock,1,cxx17
+<mutex>,unique_lock,1,cxx11
+<mutex>,swap,1,no
+<mutex>,try_lock,1,cxx11
+<mutex>,lock,1,cxx11
+<mutex>,once_flag,1,cxx11
+<mutex>,call_once,1,cxx11
+<new>,bad_alloc,1,cxx98
+<new>,bad_array_new_length,1,no
+<new>,destroying_delete_t,1,no
+<new>,destroying_delete,1,no
+<new>,align_val_t,1,no
+<new>,nothrow_t,1,cxx98
+<new>,nothrow,1,cxx98
+<new>,new_handler,1,no
+<new>,get_new_handler,1,no
+<new>,set_new_handler,1,no
+<new>,launder,1,cxx17
+<new>,hardware_destructive_interference_size,1,cxx17
+<new>,hardware_constructive_interference_size,1,cxx17
+<numbers>,numbers::e_v,1,cxx20
+<numbers>,numbers::log2e_v,1,cxx20
+<numbers>,numbers::log10e_v,1,cxx20
+<numbers>,numbers::pi_v,1,cxx20
+<numbers>,numbers::inv_pi_v,1,cxx20
+<numbers>,numbers::inv_sqrtpi_v,1,cxx20
+<numbers>,numbers::ln2_v,1,cxx20
+<numbers>,numbers::ln10_v,1,cxx20
+<numbers>,numbers::sqrt2_v,1,cxx20
+<numbers>,numbers::sqrt3_v,1,cxx20
+<numbers>,numbers::inv_sqrt3_v,1,cxx20
+<numbers>,numbers::egamma_v,1,cxx20
+<numbers>,numbers::phi_v,1,cxx20
+<optional>,optional,1,cxx17
+<optional>,nullopt_t,1,no
+<optional>,nullopt,1,cxx17
+<optional>,bad_optional_access,1,no
+<optional>,operator==,1,no
+<optional>,operator!=,1,no
+<optional>,operator<,1,no
+<optional>,operator>,1,no
+<optional>,operator<=,1,no
+<optional>,operator>=,1,no
+<optional>,operator<=>,1,no
+<optional>,swap,1,no
+<optional>,make_optional,1,cxx17
+<optional>,hash,1,no
+<ostream>,basic_ostream,1,no
+<ostream>,ostream,1,cxx98
+<ostream>,wostream,1,cxx98
+<ostream>,endl,1,cxx98
+<ostream>,ends,1,cxx98
+<ostream>,flush,1,cxx98
+<ostream>,emit_on_flush,1,cxx20
+<ostream>,noemit_on_flush,1,cxx20
+<ostream>,flush_emit,1,cxx20
+<ostream>,operator<<,1,no
+# <numeric> TODO
+<queue>,queue,1,cxx98
+<queue>,operator==,1,no
+<queue>,operator!=,1,no
+<queue>,operator<,1,no
+<queue>,operator>,1,no
+<queue>,operator<=,1,no
+<queue>,operator>=,1,no
+<queue>,operator<=>,1,no
+<queue>,swap,1,no
+<queue>,uses_allocator,1,no
+<queue>,priority_queue,1,cxx98
+# <random> TODO
+<ranges>,ranges::enable_view,1,cxx20
+<ranges>,ranges::enable_borrowed_range,1,cxx20
+# <ranges> TODO the rest
+<ratio>,ratio,1,no
+<ratio>,ratio_add,1,no
+<ratio>,ratio_subtract,1,no
+<ratio>,ratio_multiply,1,no
+<ratio>,ratio_divide,1,no
+<ratio>,ratio_equal,1,no
+<ratio>,ratio_not_equal,1,no
+<ratio>,ratio_less,1,no
+<ratio>,ratio_less_equal,1,no
+<ratio>,ratio_greater,1,no
+<ratio>,ratio_greater_equal,1,no
+<ratio>,ratio_equal_v,1,no
+<ratio>,ratio_not_equal_v,1,no
+<ratio>,ratio_less_v,1,no
+<ratio>,ratio_less_equal_v,1,no
+<ratio>,ratio_greater_v,1,no
+<ratio>,ratio_greater_equal_v,1,no
+<ratio>,yocto,1,no,__INTMAX_WIDTH__ > 80
+<ratio>,zepto,1,no,__INTMAX_WIDTH__ > 70
+<ratio>,atto,1,no
+<ratio>,femto,1,no
+<ratio>,pico,1,no
+<ratio>,nano,1,no
+<ratio>,micro,1,no
+<ratio>,milli,1,no
+<ratio>,centi,1,no
+<ratio>,deci,1,no
+<ratio>,deca,1,no
+<ratio>,hecto,1,no
+<ratio>,kilo,1,no
+<ratio>,mega,1,no
+<ratio>,giga,1,no
+<ratio>,tera,1,no
+<ratio>,peta,1,no
+<ratio>,exa,1,no
+<ratio>,zetta,1,no,__INTMAX_WIDTH__ > 70
+<ratio>,yotta,1,no,__INTMAX_WIDTH__ > 80
+# <regex> TODO
+<scoped_allocator>,scoped_allocator_adaptor,1,cxx11
+<scoped_allocator>,operator==,1,no
+<semaphore>,counting_semaphore,1,cxx20
+<semaphore>,binary_semaphore,1,cxx20
+<set>,set,1,cxx98
+<set>,multiset,1,cxx98
+<set>,operator==,1,no
+<set>,operator<=>,1,no
+<set>,swap,1,no
+<set>,erase,1,no
+<set>,erase_if,1,no
+# c++/106851 <set>,pmr::set,1,no
+# c++/106851 <set>,pmr::multiset,1,no
+<shared_mutex>,shared_mutex,1,cxx17
+<shared_mutex>,shared_timed_mutex,1,cxx14
+<shared_mutex>,shared_lock,1,cxx14
+<shared_mutex>,swap,1,no
+<source_location>,source_location,1,cxx20
+<span>,dynamic_extent,1,no
+<span>,span,1,cxx20
+<span>,ranges::enable_view,1,no
+<span>,ranges::enable_borrowed_range,1,no
+<span>,as_bytes,1,no
+<span>,as_writable_bytes,1,no
+<spanstream>,basic_spanbuf,1,cxx23
+<spanstream>,swap,1,no
+<spanstream>,spanbuf,1,cxx23
+<spanstream>,wspanbuf,1,cxx23
+<spanstream>,basic_ispanstream,1,cxx23
+<spanstream>,ispanstream,1,cxx23
+<spanstream>,wispanstream,1,cxx23
+<spanstream>,basic_ospanstream,1,cxx23
+<spanstream>,ospanstream,1,cxx23
+<spanstream>,wospanstream,1,cxx23
+<spanstream>,basic_spanstream,1,cxx23
+<spanstream>,spanstream,1,cxx23
+<spanstream>,ispanstream,1,cxx23
+<sstream>,basic_stringbuf,1,cxx98
+<sstream>,swap,1,no
+<sstream>,stringbuf,1,cxx98
+<sstream>,wstringbuf,1,cxx98
+<sstream>,basic_istringstream,1,cxx98
+<sstream>,istringstream,1,cxx98
+<sstream>,wistringstream,1,cxx98
+<sstream>,basic_ostringstream,1,cxx98
+<sstream>,ostringstream,1,cxx98
+<sstream>,wostringstream,1,cxx98
+<sstream>,basic_stringstream,1,cxx98
+<sstream>,stringstream,1,cxx98
+<sstream>,istringstream,1,cxx98
+<stack>,stack,1,cxx98
+<stack>,operator==,1,no
+<stack>,operator!=,1,no
+<stack>,operator<,1,no
+<stack>,operator>,1,no
+<stack>,operator<=,1,no
+<stack>,operator>=,1,no
+<stack>,operator<=>,1,no
+<stack>,swap,1,no
+<stack>,uses_allocator,1,no
+<stacktrace>,stacktrace_entry,1,no
+<stacktrace>,basic_stacktrace,1,no
+<stacktrace>,stacktrace,1,cxx23
+<stacktrace>,swap,1,no
+<stacktrace>,to_string,1,no
+<stacktrace>,operator<<,1,no
+# c++/106851 <stacktrace>,pmr::stacktrace,1,no
+<stacktrace>,hash,1,no
+<stdexcept>,logic_error,1,cxx98
+<stdexcept>,domain_error,1,cxx98
+<stdexcept>,invalid_argument,1,cxx98
+<stdexcept>,length_error,1,cxx98
+<stdexcept>,out_of_range,1,cxx98
+<stdexcept>,runtime_error,1,cxx98
+<stdexcept>,range_error,1,cxx98
+<stdexcept>,overflow_error,1,cxx98
+<stdexcept>,underflow_error,1,cxx98
+<stop_token>,stop_token,1,cxx20
+<stop_token>,stop_source,1,cxx20
+<stop_token>,nostopstate_t,1,no
+<stop_token>,nostopstate,1,no
+<stop_token>,stop_callback,1,cxx20
+<streambuf>,basic_streambuf,1,cxx98
+<streambuf>,streambuf,1,cxx98
+<streambuf>,wstreambuf,1,cxx98
+<string>,char_traits,1,cxx98
+<string>,basic_string,1,cxx98
+<string>,operator+,1,no
+<string>,operator==,1,no
+<string>,operator<=>,1,no
+<string>,swap,1,no
+<string>,operator<<,1,no
+<string>,operator>>,1,no
+<string>,getline,1,no
+<string>,erase,1,no
+<string>,erase_if,1,no
+<string>,string,1,cxx98
+<string>,wstring,1,cxx98
+<string>,u8string,1,cxx20
+<string>,u16string,1,cxx11
+<string>,u32string,1,cxx11
+<string>,stoi,1,cxx11
+<string>,stol,1,cxx11
+<string>,stoul,1,cxx11
+<string>,stoll,1,cxx11
+<string>,stoull,1,cxx11
+<string>,stof,1,cxx11
+<string>,stod,1,cxx11
+<string>,stold,1,cxx11
+<string>,to_string,1,cxx17
+<string>,to_wstring,1,cxx17
+# c++/106851 <string>,pmr::string,1,cxx17
+# c++/106851 <string>,pmr::wstring,1,cxx17
+# c++/106851 <string>,pmr::u8string,1,cxx20
+# c++/106851 <string>,pmr::u16string,1,cxx17
+# c++/106851 <string>,pmr::u32string,1,cxx17
+<string_view>,basic_string_view,1,cxx17
+<string_view>,ranges::enable_view,1,no
+<string_view>,ranges::enable_borrowed_range,1,no
+<string_view>,operator==,1,no
+<string_view>,operator<=>,1,no
+<string_view>,operator<<,1,no
+<string_view>,string_view,1,cxx17
+<string_view>,hash,1,no
+<string_view>,literals::string_literals::operator""sv,1,no
+<system_error>,error_category,1,cxx11
+<system_error>,generic_category,1,cxx11
+<system_error>,system_category,1,cxx11
+<system_error>,error_code,1,cxx11
+<system_error>,error_condition,1,cxx11
+<system_error>,is_error_code_enum,1,cxx11
+<system_error>,is_error_condition_enum,1,cxx11
+<system_error>,errc,1,cxx11
+<system_error>,make_error_code,1,cxx11
+<system_error>,make_error_condition,1,cxx11
+<system_error>,operator==,1,no
+<system_error>,operator<=>,1,no
+<system_error>,hash,1,no
+<system_error>,is_error_code_enum_v,1,cxx17
+<system_error>,is_error_condition_enum_v,1,cxx17
+<syncstream>,basic_syncbuf,1,no
+<syncstream>,swap,1,no
+<syncstream>,syncbuf,1,no
+<syncstream>,wsyncbuf,1,no
+<syncstream>,basic_osyncstream,1,no
+<syncstream>,osyncstream,1,no
+<syncstream>,wosyncstream,1,no
+<thread>,thread,1,cxx11
+<thread>,swap,1,no
+<thread>,jthread,1,cxx20
+<thread>,this_thread,0,cxx11
+<thread>,this_thread::get_id,1,no
+<thread>,this_thread::yield,1,no
+<thread>,this_thread::sleep_until,1,no
+<thread>,this_thread::sleep_for,1,no
+<tuple>,tuple,1,cxx11
+<tuple>,basic_common_reference,1,no
+<tuple>,common_type,1,no
+<tuple>,ignore,1,no
+<tuple>,make_tuple,1,cxx11
+<tuple>,forward_as_tuple,1,cxx11
+<tuple>,tie,1,cxx11
+<tuple>,tuple_cat,1,cxx11
+<tuple>,apply,1,cxx17
+<tuple>,make_from_tuple,1,cxx17
+<tuple>,tuple_size,1,cxx11
+<tuple>,tuple_size_v,1,cxx17
+<tuple>,tuple_element,1,cxx11
+<tuple>,tuple_element_t,1,cxx14
+<tuple>,get,1,no
+<tuple>,operator==,1,no
+<tuple>,operator<=>,1,no
+<tuple>,uses_allocator,1,no
+<tuple>,swap,1,no
+<typeindex>,type_index,1,cxx11
+<typeindex>,hash,1,no
+<typeinfo>,type_info,1,no
+<typeinfo>,bad_cast,1,cxx98
+<typeinfo>,bad_typeid,1,cxx98
+<type_traits>,enable_if,1,cxx11
+<type_traits>,enable_if_t,1,cxx14
+<type_traits>,invoke_result,1,cxx17
+<type_traits>,invoke_result_t,1,cxx17
+<type_traits>,remove_cvref,1,cxx20
+<type_traits>,remove_cvref_t,1,cxx20
+<type_traits>,type_identity,1,cxx20
+<type_traits>,type_identity_t,1,cxx20
+<type_traits>,void_t,1,cxx17
+<type_traits>,conjunction,1,cxx17
+<type_traits>,conjunction_v,1,cxx17
+<type_traits>,disjunction,1,cxx17
+<type_traits>,disjunction_v,1,cxx17
+<type_traits>,negation,1,cxx17
+<type_traits>,negation_v,1,cxx17
+<unordered_map>,unordered_map,1,cxx11
+<unordered_map>,unordered_multimap,1,cxx11
+<unordered_map>,operator==,1,no
+<unordered_map>,operator<=>,1,no
+<unordered_map>,swap,1,no
+<unordered_map>,erase,1,no
+<unordered_map>,erase_if,1,no
+# c++/106851 <unordered_map>,pmr::unordered_map,1,cxx17
+# c++/106851 <unordered_map>,pmr::unordered_multimap,1,cxx17
+<unordered_set>,unordered_set,1,cxx11
+<unordered_set>,unordered_multiset,1,cxx11
+<unordered_set>,operator==,1,no
+<unordered_set>,operator<=>,1,no
+<unordered_set>,swap,1,no
+<unordered_set>,erase,1,no
+<unordered_set>,erase_if,1,no
+# c++/106851 <unordered_set>,pmr::unordered_set,1,no
+# c++/106851 <unordered_set>,pmr::unordered_multiset,1,no
+<utility>,swap,1,no
+<utility>,exchange,1,cxx14
+<utility>,forward,1,cxx11
+# unimplemented <utility>,forward_like,1,cxx23
+<utility>,move,1,cxx11
+<utility>,move_if_noexcept,1,cxx11
+<utility>,as_const,1,cxx17
+<utility>,declval,1,cxx11
+<utility>,cmp_equal,1,cxx20
+<utility>,cmp_not_equal,1,cxx20
+<utility>,cmp_less,1,cxx20
+<utility>,cmp_greater,1,cxx20
+<utility>,cmp_less_equal,1,cxx20
+<utility>,cmp_greater_equal,1,cxx20
+<utility>,in_range,1,cxx20
+<utility>,to_underlying,1,cxx23
+<utility>,unreachable,1,cxx23
+<utility>,integer_sequence,1,cxx14
+<utility>,index_sequence,1,cxx14
+<utility>,make_integer_sequence,1,cxx14
+<utility>,make_index_sequence,1,cxx14
+<utility>,index_sequence_for,1,cxx14
+<utility>,pair,1,cxx98
+<utility>,operator==,1,no
+<utility>,operator<=>,1,no
+<utility>,basic_common_reference,1,no
+<utility>,common_type,1,no
+<utility>,make_pair,1,cxx98
+<utility>,tuple_size,1,no
+<utility>,tuple_element,1,no
+<utility>,get,1,no
+<utility>,piecewise_construct_t,1,cxx11
+<utility>,piecewise_construct,1,cxx11
+<utility>,in_place_t,1,cxx17
+<utility>,in_place,1,cxx17
+<utility>,in_place_type_t,1,cxx17
+<utility>,in_place_type,1,cxx17
+<utility>,in_place_index_t,1,cxx17
+<utility>,in_place_index,1,cxx17
+# <valarray> TODO
+<variant>,variant,1,cxx17
+<variant>,variant_size,1,cxx17
+<variant>,variant_size_v,1,cxx17
+<variant>,variant_alternative,1,cxx17
+<variant>,variant_alternative_t,1,cxx17
+<variant>,variant_npos,1,cxx17
+<variant>,holds_alternative,1,cxx17
+<variant>,get,1,no
+<variant>,get_if,1,no
+<variant>,operator==,1,no
+<variant>,operator!=,1,no
+<variant>,operator<,1,no
+<variant>,operator>,1,no
+<variant>,operator<=,1,no
+<variant>,operator>=,1,no
+<variant>,operator<=>,1,no
+<variant>,visit,1,cxx17
+<variant>,monostate,1,cxx17
+<variant>,swap,1,no
+<variant>,bad_variant_access,1,cxx17
+<variant>,hash,1,no
+<vector>,vector,1,cxx98
+<vector>,operator==,1,no
+<vector>,operator<=>,1,no
+<vector>,swap,1,no
+<vector>,erase,1,no
+<vector>,erase_if,1,no
+<vector>,hash,1,no
+# <version> contains no exportable names
+# <cassert> contains no exportable names
+# <cctype> TODO
+<cfenv>,fenv_t,1,no
+<cfenv>,fexcept_t,1,no
+<cfenv>,feclearexcept,1,no
+<cfenv>,fegetexceptflag,1,no
+<cfenv>,feraiseexcept,1,no
+<cfenv>,fesetexceptflag,1,no
+<cfenv>,fetestexcept,1,no
+<cfenv>,fegetround,1,no
+<cfenv>,fesetround,1,no
+<cfenv>,fegetenv,1,no
+<cfenv>,feholdexcept,1,no
+<cfenv>,fesetenv,1,no
+<cfenv>,feupdateenv,1,no
+<cinttypes>,imaxdiv_t,1,no
+<cinttypes>,imaxabs,1,no
+<cinttypes>,imaxdiv,1,no
+<cinttypes>,strtoimax,1,no
+<cinttypes>,strtoumax,1,no
+<cinttypes>,wcstoimax,1,no
+<cinttypes>,wcstoumax,1,no
+<cinttypes>,abs,1,no
+<cinttypes>,div,1,no
+# <climits> only contains macros, handled by get_stdlib_header_for_name
+# <climits>,CHAR_BIT,0,cxx98
+# <climits>,SCHAR_MIN,0,cxx98
+# <climits>,SCHAR_MAX,0,cxx98
+# <climits>,UCHAR_MAX,0,cxx98
+# <climits>,CHAR_MIN,0,cxx98
+# <climits>,CHAR_MAX,0,cxx98
+# <climits>,MB_LEN_MAX,0,cxx98
+# <climits>,SHRT_MIN,0,cxx98
+# <climits>,SHRT_MAX,0,cxx98
+# <climits>,USHRT_MAX,0,cxx98
+# <climits>,INT_MIN,0,cxx98
+# <climits>,INT_MAX,0,cxx98
+# <climits>,UINT_MAX,0,cxx98
+# <climits>,LONG_MIN,0,cxx98
+# <climits>,LONG_MAX,0,cxx98
+# <climits>,ULONG_MAX,0,cxx98
+# <climits>,LLONG_MIN,0,cxx98
+# <climits>,LLONG_MAX,0,cxx11
+# <climits>,ULLONG_MAX,0,cxx11
+<clocale>,lconv,1,no
+<clocale>,setlocale,1,no
+<clocale>,localeconv,1,no
+# <cmath> TODO 
+<csetjmp>,jmp_buf,1,no
+<csetjmp>,longjmp,1,no
+<csignal>,sig_atomic_t,1,no
+<csignal>,signal,1,no
+<csignal>,raise,1,no
+<csignal>,va_list,1,no
+<cstddef>,ptrdiff_t,1,no
+<cstddef>,size_t,1,no
+<cstddef>,max_align_t,1,no
+<cstddef>,nullptr_t,1,no
+<cstddef>,byte,1,no
+<cstddef>,operator<<=,1,no
+<cstddef>,operator<<,1,no
+<cstddef>,operator>>=,1,no
+<cstddef>,operator>>,1,no
+<cstddef>,operator|=,1,no
+<cstddef>,operator|,1,no
+<cstddef>,operator&=,1,no
+<cstddef>,operator&,1,no
+<cstddef>,operator^=,1,no
+<cstddef>,operator^,1,no
+<cstddef>,operator~,1,no
+<cstddef>,to_integer,1,no
+<cstdint>,int8_t,1,no
+<cstdint>,int16_t,1,no
+<cstdint>,int32_t,1,no
+<cstdint>,int64_t,1,no
+<cstdint>,int_fast8_t,1,no
+<cstdint>,int_fast16_t,1,no
+<cstdint>,int_fast32_t,1,no
+<cstdint>,int_fast64_t,1,no
+<cstdint>,int_least8_t,1,no
+<cstdint>,int_least16_t,1,no
+<cstdint>,int_least32_t,1,no
+<cstdint>,int_least64_t,1,no
+<cstdint>,intmax_t,1,no
+<cstdint>,intptr_t,1,no
+<cstdint>,uint8_t,1,no
+<cstdint>,uint16_t,1,no
+<cstdint>,uint32_t,1,no
+<cstdint>,uint64_t,1,no
+<cstdint>,uint_fast8_t,1,cxx11
+<cstdint>,uint_fast16_t,1,cxx11
+<cstdint>,uint_fast32_t,1,cxx11
+<cstdint>,uint_fast64_t,1,cxx11
+<cstdint>,uint_least8_t,1,cxx11
+<cstdint>,uint_least16_t,1,cxx11
+<cstdint>,uint_least32_t,1,cxx11
+<cstdint>,uint_least64_t,1,cxx11
+<cstdint>,uintmax_t,1,cxx11
+<cstdint>,uintptr_t,1,cxx11
+# <cstdio> TODO
+# <cstdlib> TODO
+# <cstring> TODO
+# <ctime> TODO
+# <cuchar> TODO
+# <cwchar> TODO
+# <cwctype> TODO
--- /dev/null	2022-09-07 09:53:26.084773798 +0200
+++ b/gcc/cp/gen-cxxapi-file.py	2022-09-12 09:24:49.706186291 +0200
@@ -0,0 +1,183 @@
+#!/usr/bin/env python3
+
+# Copyright (C) 2022 Free Software Foundation, Inc.
+# This file is part of GCC.
+
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+
+# Generate gcc source files:
+# - the export description of the standard C++ library module
+# - the gperf tables used to hint at actions to fix problems
+#   related to missing symbols in the std:: namespace
+
+import csv
+import time
+
+# The CSV file contains the following columns:
+#  column  value
+#       1  header file
+#       2  symbol name without std:: prefix
+#       3  nonzero if to be exported
+#       4  "no" if not to be added to the hint table else the appropriate enum cxx_dialect value
+#       5  optional, a string used after #if in a line inserted first to enable conditional definitions
+
+
+def print_condition(prev, e):
+    if len(e) > 4 and e[4] != '':
+        if not prev or prev != e[4]:
+            if prev:
+                print('#endif')
+            print(f'#if {e[4]}')
+        return e[4]
+    if prev:
+        print('#endif')
+    return None
+
+
+def export(script, content):
+    print("""// This file is auto-generated by {:s}.
+#if __cplusplus <= 202002L
+# if __cplusplus == 202002L
+#  ifdef __STRICT_ANSI__
+#   error "module `std' is only available before C++23 if using -std=gnu++20"
+#  endif
+# else
+#  error "module `std' is not available before C++23"
+# endif
+#endif
+ 
+export module std;
+ 
+import <bits/stdc++.h>;
+
+// new/delete operators in global namespace from <new>
+export using ::operator new;
+export using ::operator delete;
+export using ::operator new[];
+export using ::operator delete[];""".format(script))
+    header=''
+    printed_header=False
+    cond = None
+    for e in content:
+        if e[0] != header:
+            header = e[0]
+            printed_header=False
+        if e[2] != 0:
+            if not printed_header:
+                if cond:
+                    print('#endif')
+                    cond = None
+                print(f'\n// {header}')
+                printed_header=True
+            cond = print_condition(cond, e)
+            print(f'export using std::{e[1]};')
+    if cond:
+        print('#endif')
+
+def hints(script, content):
+    print("""%language=C++
+%define class-name std_name_hint_lookup
+%struct-type
+%{{
+/* This file is auto-generated by {:s}.  */
+/* Copyright (C) {:s} Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 3, or (at your option) any later
+version.
+
+GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+%}}
+struct std_name_hint
+{{
+  /* A name within "std::".  */
+  const char *name;
+
+  /* The header name defining it within the C++ Standard Library
+     (with '<' and '>').  */
+  const char* header;
+
+  /* The dialect of C++ in which this was added.  */
+  enum cxx_dialect min_dialect;
+}};
+%%
+# The standard-defined types, functions, and options in the std:: namespace
+# as defined in the C++ language specification.  The result is used in the
+# get_std_name_hint functions.
+#   throws an exception.
+#""".format(script, time.strftime('%Y')))
+    header=''
+    printed_header=False
+    for e in content:
+        if e[0] != header:
+            header = e[0]
+            printed_header=False
+        if e[3] != 'no':
+            if not printed_header:
+                print(f'# {header}')
+                printed_header=True
+            print(f'{e[1]}, "{e[0]}", {e[3]}')
+
+def remove_comment(f):
+    for row in f:
+        row = row.strip()
+        if row[0] != '#':
+            yield row
+
+modes = {
+    'export': export,
+    'hints': hints
+}
+
+def usage(script):
+    print(f'Usage: {script} [{"|".join(modes.keys())}] CSVFILE')
+    exit(1)
+
+def main(argv):
+    if len(argv) < 3:
+        usage(argv[0] if len(argv) > 0 else '???')
+
+    script = argv[0]
+    mode = argv[1]
+    filename = argv[2]
+
+    if not mode in modes:
+        print(f"{script}: unrecognized mode '{mode}'")
+        usage(script)
+
+    try:
+        with open(filename, 'r') as csvfile:
+            modes[mode](script, sorted(csv.reader(remove_comment(csvfile), delimiter=',')))
+    except FileNotFoundError:
+        print(f"{script}: cannot find CSV file '{filename}'")
+        exit(1)
+    except PermissionError:
+        print(f"{script}: insufficient permission to read CSV file '{filename}'")
+        exit(1)
+
+if __name__ == '__main__':
+    import sys
+    main(sys.argv)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] C++ API database
  2022-09-12 11:51 [PATCH] C++ API database Ulrich Drepper
@ 2022-09-28 16:59 ` Ulrich Drepper
  2022-10-18  0:56   ` Jason Merrill
  0 siblings, 1 reply; 6+ messages in thread
From: Ulrich Drepper @ 2022-09-28 16:59 UTC (permalink / raw)
  To: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 3788 bytes --]

Ping.  Anyone having problems with this?  And the governance of the file?

On Mon, Sep 12, 2022 at 1:51 PM Ulrich Drepper <drepper@redhat.com> wrote:

> After my prior inquiry into the use of python as a build tool for
> maintainers didn't produce any negative comments and several active and
> even enthusiastic support message I'm going forward with submitting the
> patch.
>
> To repeat the detail, for the generation of the upcoming C++ standard
> library module and the hints for missing definitions/declarations in the
> std:: namespace we need a list of standard C++ APIs.  The information
> needed for the two use cases is different but the actual APIs overlap
> almost completely and therefore it would be a bad idea to have the data
> separated.
>
> We could opt for a file format that is easy to read in awk and writing the
> appropriate scripts to transform the data into the appropriate output
> format but this looks ugly, is hard to understand, and a nightmare to
> maintain.  On the other hand, writing the code in Python is simple and
> clean.
>
>
> Therefore, Jonathan and I worked on a CSV file which contains the
> necessary information and a Python to create the gperf input file to
> generate std-name-hint.h and also, in future, the complete source of the
> export interface description for the standard library module.  This mode is
> not yet used because the module support isn't ready yet.  The output file
> corresponds to the hand-coded version of the export code Jonathan uses
> right now.
>
> Note that in both of these cases the generated files are static, they
> don't depend on the local configuration and therefore are checked into the
> source code repository.  The script only has to run if the generated files
> are explicitly removed or, in maintainer mode, if the CSV file has
> changed.  For normal compilation from a healthy source code tree the tool
> is not needed.
>
>
> One remaining issue is the responsibility for the CSV file.  The file
> needs to live in the directory of the frontend and therefore nominally
> changes need to be approved by the frontend maintainers.  The content
> entirely consists of information from the standard library, though.  Any
> change that doesn't break the build on one machine (i.e., the Python script
> doesn't fail) will not course any problem because the output format of the
> script is correct.  Therefore we have been wondering whether the CSV file
> should at least have shared ownership between the frontend maintainers and
> the libstdc++ maintainers.
>
> The CSV file contain more hint information than the old hand-coded .gperf
> file.  So, an additional effect of this patch is the extension of the hints
> that are provided but given that the lookup is now fast this shouldn't have
> any negative impact.  The file is not complete, though, this will come over
> time and definitely before the module support is done.
>
> I build my complete set of compilers with this patch without problems.
>
> Any comments?
>
> 2022-09-12  Jonathan Wakely  <jwakely@redhat.com>
>             Ulrich Drepper  <drepper@redhat.com>
>
> contrib/ChangeLog
>         * gcc_update: Add rule to generate gcc/cp/std-name-hint.gperf.
>
> gcc/cp/ChangeLog
>         * Make-lang.in: Add rule to generate gcc/cp/std-name-hint.gperf.
>         Adjust rule to generate $(srcdir)/cp/std-name-hint.h.
>         Add explicit rule to depend cp/name-lookup.o on
>         $(srcdir)/cp/std-name-hint.h.
>         * cxxapi-data.csv: New file.  Database of C++ APIs.
>         * gen-cxxapi-file.py: New file.  Script to generate source code for
>         C++ standard library exports and to generate C++ std:: namespace
>         fix hints.
>         * std-name-hint.gperf: Regenerated.
>         * std-name-hint.h: Regenerated.
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] C++ API database
  2022-09-28 16:59 ` Ulrich Drepper
@ 2022-10-18  0:56   ` Jason Merrill
  2022-10-18 11:01     ` Ulrich Drepper
  0 siblings, 1 reply; 6+ messages in thread
From: Jason Merrill @ 2022-10-18  0:56 UTC (permalink / raw)
  To: Ulrich Drepper, gcc-patches

On 9/28/22 12:59, Ulrich Drepper via Gcc-patches wrote:
> Ping.  Anyone having problems with this?  And the governance of the file?

Hmm, for some reason this didn't show up on my C++ patches filter. 
Please do CC me when pinging C++ patches.

> On Mon, Sep 12, 2022 at 1:51 PM Ulrich Drepper <drepper@redhat.com> wrote:
> 
>> After my prior inquiry into the use of python as a build tool for
>> maintainers didn't produce any negative comments and several active and
>> even enthusiastic support message I'm going forward with submitting the
>> patch.
>>
>> To repeat the detail, for the generation of the upcoming C++ standard
>> library module and the hints for missing definitions/declarations in the
>> std:: namespace we need a list of standard C++ APIs.  The information
>> needed for the two use cases is different but the actual APIs overlap
>> almost completely and therefore it would be a bad idea to have the data
>> separated.
>>
>> We could opt for a file format that is easy to read in awk and writing the
>> appropriate scripts to transform the data into the appropriate output
>> format but this looks ugly, is hard to understand, and a nightmare to
>> maintain.  On the other hand, writing the code in Python is simple and
>> clean.
>>
>>
>> Therefore, Jonathan and I worked on a CSV file which contains the
>> necessary information and a Python to create the gperf input file to
>> generate std-name-hint.h and also, in future, the complete source of the
>> export interface description for the standard library module.  This mode is
>> not yet used because the module support isn't ready yet.  The output file
>> corresponds to the hand-coded version of the export code Jonathan uses
>> right now.
>>
>> Note that in both of these cases the generated files are static, they
>> don't depend on the local configuration and therefore are checked into the
>> source code repository.  The script only has to run if the generated files
>> are explicitly removed or, in maintainer mode, if the CSV file has
>> changed.  For normal compilation from a healthy source code tree the tool
>> is not needed.
>>
>>
>> One remaining issue is the responsibility for the CSV file.  The file
>> needs to live in the directory of the frontend and therefore nominally
>> changes need to be approved by the frontend maintainers.  The content
>> entirely consists of information from the standard library, though.  Any
>> change that doesn't break the build on one machine (i.e., the Python script
>> doesn't fail) will not course any problem because the output format of the
>> script is correct.  Therefore we have been wondering whether the CSV file
>> should at least have shared ownership between the frontend maintainers and
>> the libstdc++ maintainers.

That makes sense; the file could say something to that effect.  Or the 
CSV file could live in the library directory, or a third directory.  And 
maybe separate the two generators; it seems like the code shared between 
them is pretty small.

>> The CSV file contain more hint information than the old hand-coded .gperf
>> file.  So, an additional effect of this patch is the extension of the hints
>> that are provided but given that the lookup is now fast this shouldn't have
>> any negative impact.  The file is not complete, though, this will come over
>> time and definitely before the module support is done.
>>
>> I build my complete set of compilers with this patch without problems.
>>
>> Any comments?

Generally, looks good.

The CSV file could use a header row documenting the fields (as well as 
the documentation in the script).

> +# This is the file that depends in the generated header file.

s/in/on/

Jason


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] C++ API database
  2022-10-18  0:56   ` Jason Merrill
@ 2022-10-18 11:01     ` Ulrich Drepper
  2022-10-18 11:04       ` Martin Liška
  2022-10-18 11:15       ` Jakub Jelinek
  0 siblings, 2 replies; 6+ messages in thread
From: Ulrich Drepper @ 2022-10-18 11:01 UTC (permalink / raw)
  To: Jason Merrill; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 3024 bytes --]

On Tue, Oct 18, 2022 at 2:56 AM Jason Merrill <jason@redhat.com> wrote:

> That makes sense; the file could say something to that effect.


I did that.



>   Or the
> CSV file could live in the library directory, or a third directory.


The reasoning is that with the file living in the cp subdir we don't have
the situation that the compiler sources depend on something that lives
elsewhere.  Unless I miss something, there are no such outside dependencies
and one can build the compiler without the libstdc++ subdir to exist.




>   And
> maybe separate the two generators; it seems like the code shared between them
> is pretty small.
>

The shared code as-is is small, but so is the whole script.

Unless someone feels strongly about it I'd prefer not to split the file.
It is far easier to forget to make adequate changes in multiple places.
There can be changes to the format going forward and even yet another
consumer of that information.  Keeping more than one (or two, if you count
the CSV file) places is sync is asking for trouble.


The CSV file could use a header row documenting the fields (as well as

> the documentation in the script).
>

I duplicated the information from the script in the CSV file itself.



> > +# This is the file that depends in the generated header file.
>
> s/in/on/
>

Done.


There is one additional issue, though, which will likely not hit anyone
here but theoretically is handled in the current version of the build
infrastructure.

The Makefile contains the provision outside of maintainer mode to rebuild
the generated files by removing the generated file first.  This will
require the tools (gperf) to be available but that's deemed OK.

With this CSV file as the source of the information we have a two-step
derivation of the generated file, though:

CSV -> .gperf -> .h

The trick used to avoid the rebuild of the .h file today is to not have a
prerequisite for the rule.  This doesn't work for the two-step process.  If
the .h and.gperf files are removed there would be no information about the
dependency of the .h generation on the .gperf file.

This is of course not a new problem in general.  GNU make has for a long
time support for order-only prerequisites.  With those one can exactly
express what is needed:

ifeq ($(ENABLE_MAINTAINER_RULES), true)
FOO.h: FOO.gperf
else
FOO.h: | FOO.gperf
endif
        gperf ...

ifeq ($(ENABLE_MAINTAINER_RULES), true)
FOO.gperf: CSV
else
FOO.gperf: | CSV
endif
        python ...

The question here is whether there is a reason not to depend on GNU make
features (and whatever other make implemented this extension).


The alternative would be to not expose the .gperf file at all, remove it
from git and remove it after the .h file was created.  This gets us back to
a one-step process which the unclean make trick can handle.

I haven't found an obvious place where tool dependencies are recorded so I
have no idea what the assumptions are.

Any comment on this?

I have a patch with the order-only rule ready to send out.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] C++ API database
  2022-10-18 11:01     ` Ulrich Drepper
@ 2022-10-18 11:04       ` Martin Liška
  2022-10-18 11:15       ` Jakub Jelinek
  1 sibling, 0 replies; 6+ messages in thread
From: Martin Liška @ 2022-10-18 11:04 UTC (permalink / raw)
  To: Ulrich Drepper, Jason Merrill; +Cc: gcc-patches

On 10/18/22 13:01, Ulrich Drepper via Gcc-patches wrote:
> On Tue, Oct 18, 2022 at 2:56 AM Jason Merrill <jason@redhat.com> wrote:
> 
>> That makes sense; the file could say something to that effect.
> 
> 
> I did that.
> 
> 
> 
>>   Or the
>> CSV file could live in the library directory, or a third directory.
> 
> 
> The reasoning is that with the file living in the cp subdir we don't have
> the situation that the compiler sources depend on something that lives
> elsewhere.  Unless I miss something, there are no such outside dependencies
> and one can build the compiler without the libstdc++ subdir to exist.
> 
> 
> 
> 
>>   And
>> maybe separate the two generators; it seems like the code shared between them
>> is pretty small.
>>
> 
> The shared code as-is is small, but so is the whole script.
> 
> Unless someone feels strongly about it I'd prefer not to split the file.
> It is far easier to forget to make adequate changes in multiple places.
> There can be changes to the format going forward and even yet another
> consumer of that information.  Keeping more than one (or two, if you count
> the CSV file) places is sync is asking for trouble.
> 
> 
> The CSV file could use a header row documenting the fields (as well as
> 
>> the documentation in the script).
>>
> 
> I duplicated the information from the script in the CSV file itself.
> 
> 
> 
>>> +# This is the file that depends in the generated header file.
>>
>> s/in/on/
>>
> 
> Done.
> 
> 
> There is one additional issue, though, which will likely not hit anyone
> here but theoretically is handled in the current version of the build
> infrastructure.
> 
> The Makefile contains the provision outside of maintainer mode to rebuild
> the generated files by removing the generated file first.  This will
> require the tools (gperf) to be available but that's deemed OK.
> 
> With this CSV file as the source of the information we have a two-step
> derivation of the generated file, though:
> 
> CSV -> .gperf -> .h
> 
> The trick used to avoid the rebuild of the .h file today is to not have a
> prerequisite for the rule.  This doesn't work for the two-step process.  If
> the .h and.gperf files are removed there would be no information about the
> dependency of the .h generation on the .gperf file.
> 
> This is of course not a new problem in general.  GNU make has for a long
> time support for order-only prerequisites.  With those one can exactly
> express what is needed:
> 
> ifeq ($(ENABLE_MAINTAINER_RULES), true)
> FOO.h: FOO.gperf
> else
> FOO.h: | FOO.gperf
> endif
>         gperf ...
> 
> ifeq ($(ENABLE_MAINTAINER_RULES), true)
> FOO.gperf: CSV
> else
> FOO.gperf: | CSV
> endif
>         python ...
> 
> The question here is whether there is a reason not to depend on GNU make
> features (and whatever other make implemented this extension).
> 
> 
> The alternative would be to not expose the .gperf file at all, remove it
> from git and remove it after the .h file was created.  This gets us back to
> a one-step process which the unclean make trick can handle.
> 
> I haven't found an obvious place where tool dependencies are recorded so I
> have no idea what the assumptions are.
> 
> Any comment on this?
> 
> I have a patch with the order-only rule ready to send out.

Hi.

Can you please fix the coding style of the newly added Python scripts?
I documented what's expected from Python scripts here:
https://gcc.gnu.org/git/?p=gcc-wwwdocs.git;a=commitdiff;h=ece15e0758bdbb6938942a9f91f6342e66fe443a

But unfortunately, the change hasn't reached yet:
https://gcc.gnu.org/codingconventions.html

The issues I see:

gcc/cp/gen-cxxapi-file.py:34:80: E501 line too long (96 > 79 characters)
gcc/cp/gen-cxxapi-file.py:35:80: E501 line too long (103 > 79 characters)
gcc/cp/gen-cxxapi-file.py:61:1: W293 blank line contains whitespace
gcc/cp/gen-cxxapi-file.py:63:1: W293 blank line contains whitespace
gcc/cp/gen-cxxapi-file.py:71:11: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:72:19: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:77:27: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:84:31: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:90:1: E302 expected 2 blank lines, found 1
gcc/cp/gen-cxxapi-file.py:132:11: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:133:19: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:137:27: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:141:31: E225 missing whitespace around operator
gcc/cp/gen-cxxapi-file.py:144:1: E302 expected 2 blank lines, found 1
gcc/cp/gen-cxxapi-file.py:150:1: E305 expected 2 blank lines after class or function definition, found 1
gcc/cp/gen-cxxapi-file.py:155:1: E302 expected 2 blank lines, found 1
gcc/cp/gen-cxxapi-file.py:159:1: E302 expected 2 blank lines, found 1
gcc/cp/gen-cxxapi-file.py:167:8: E713 test for membership should be 'not in'
gcc/cp/gen-cxxapi-file.py:173:80: E501 line too long (91 > 79 characters)
gcc/cp/gen-cxxapi-file.py:178:80: E501 line too long (81 > 79 characters)
gcc/cp/gen-cxxapi-file.py:181:1: E305 expected 2 blank lines after class or function definition, found 1

Note that we may want to relax the E501 issues to something like 120 chars:
see: ./maintainer-scripts/setup.cfg

Thanks,
Martin

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] C++ API database
  2022-10-18 11:01     ` Ulrich Drepper
  2022-10-18 11:04       ` Martin Liška
@ 2022-10-18 11:15       ` Jakub Jelinek
  1 sibling, 0 replies; 6+ messages in thread
From: Jakub Jelinek @ 2022-10-18 11:15 UTC (permalink / raw)
  To: Ulrich Drepper; +Cc: Jason Merrill, gcc-patches

On Tue, Oct 18, 2022 at 01:01:14PM +0200, Ulrich Drepper via Gcc-patches wrote:
> This is of course not a new problem in general.  GNU make has for a long
> time support for order-only prerequisites.  With those one can exactly
> express what is needed:
> 
> ifeq ($(ENABLE_MAINTAINER_RULES), true)
> FOO.h: FOO.gperf
> else
> FOO.h: | FOO.gperf
> endif
>         gperf ...
> 
> ifeq ($(ENABLE_MAINTAINER_RULES), true)
> FOO.gperf: CSV
> else
> FOO.gperf: | CSV
> endif
>         python ...
> 
> The question here is whether there is a reason not to depend on GNU make
> features (and whatever other make implemented this extension).

GCC requires GNU make and we already use order-only prerequisities in
gcc/Makefile.in :
# In order for parallel make to really start compiling the expensive
# objects from $(OBJS) as early as possible, build all their
# prerequisites strictly before all objects.
$(ALL_HOST_OBJS) : | $(generated_files)

	Jakub


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-10-18 11:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-09-12 11:51 [PATCH] C++ API database Ulrich Drepper
2022-09-28 16:59 ` Ulrich Drepper
2022-10-18  0:56   ` Jason Merrill
2022-10-18 11:01     ` Ulrich Drepper
2022-10-18 11:04       ` Martin Liška
2022-10-18 11:15       ` Jakub Jelinek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).