Add C++ library interface data

This patch adds a CSV file with information about the API of the
standard C++ library.  This information can be used in multiple ways.
So far there are two use cases:

- to generate the module export list for the standard C++ library
- to create the name hints to compiler emits when symbols in the
  std namespace are not found

Adding more uses can be easily done by potentially adding more columns
to the CSV file and adding to the Python script which generates the
output file.

contrib/
2022-10-18  Jonathan Wakely   <jwakely@redhat.com>
	    Ulrich Drepper  <drepper@redhat.com>

	* gcc_update: Add rule for gcc/cp/std-name-hint.gperf.

gcc/cp/
2022-10-18  Jonathan Wakely   <jwakely@redhat.com>
	    Ulrich Drepper  <drepper@redhat.com>

	* Make-lang.in: Add rules to generate std-name-hint.gperf.  Adjust
	rule to generate std-name-hint.h to allow chain rule.
	* std-name-hint.h: Regenerated.
	* std-name-hint.gperf: This file is now generated.
	* cxxapi-data.csv: New file.  CSV file with C++ API data.
	* gen-cxxapi-file.py: New file.  Generate std-name-hint.gperf
	and module export source (in future).
This commit is contained in:
Ulrich Drepper 2022-10-20 10:50:23 +02:00
parent 53e6d7a310
commit a2e2838935
6 changed files with 2441 additions and 569 deletions

View file

@ -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

View file

@ -153,15 +153,30 @@ 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.
# We always need the dependency on the .gperf file because it itself is generated.
ifeq ($(ENABLE_MAINTAINER_RULES), true)
$(srcdir)/cp/std-name-hint.h: $(srcdir)/cp/std-name-hint.gperf
else
$(srcdir)/cp/std-name-hint.h:
$(srcdir)/cp/std-name-hint.h: | $(srcdir)/cp/std-name-hint.gperf
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 > $@
ifneq ($(ENABLE_MAINTAINER_RULES), true)
.SECONDARY: $(srcdir)/cp/std-name-hint.gperf
endif
# This is the file that depends on 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

1032
gcc/cp/cxxapi-data.csv Normal file

File diff suppressed because it is too large Load diff

190
gcc/cp/gen-cxxapi-file.py Normal file
View file

@ -0,0 +1,190 @@
#!/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 os
import time
# The CSV file contains the following columns:
# column value
# 1 header file, including angle brackets
# 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 mode not in modes:
print(f"{script}: unrecognized mode '{mode}'")
usage(script)
try:
with open(filename, 'r') as csvfile:
modes[mode](os.path.basename(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)

View file

@ -2,6 +2,7 @@
%define class-name std_name_hint_lookup
%struct-type
%{
/* This file is auto-generated by 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>
resetiosflags, "<iomanip>", cxx98
setiosflags, "<iomanip>", cxx98
setbase, "<iomanip>", cxx98
setfill, "<iomanip>", cxx98
setprecision, "<iomanip>", cxx98
setw, "<iomanip>", cxx98
get_money, "<iomanip>", cxx11
put_money, "<iomanip>", cxx11
get_time, "<iomanip>", cxx11
put_money, "<iomanip>", cxx11
put_time, "<iomanip>", cxx11
quoted, "<iomanip>", cxx14
resetiosflags, "<iomanip>", cxx98
setbase, "<iomanip>", cxx98
setfill, "<iomanip>", cxx98
setiosflags, "<iomanip>", cxx98
setprecision, "<iomanip>", cxx98
setw, "<iomanip>", cxx98
# <ios>
boolalpha, "<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
dec, "<ios>", cxx98
defaultfloat, "<ios>", cxx11
fixed, "<ios>", cxx98
hex, "<ios>", cxx98
hexfloat, "<ios>", cxx11
internal, "<ios>", cxx98
left, "<ios>", cxx98
right, "<ios>", cxx98
dec, "<ios>", cxx98
hex, "<ios>", cxx98
noboolalpha, "<ios>", cxx98
noshowbase, "<ios>", cxx98
noshowpoint, "<ios>", cxx98
noshowpos, "<ios>", cxx98
noskipws, "<ios>", cxx98
nounitbuf, "<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>
mutex, "<mutex>", cxx11
timed_mutex, "<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
try_lock, "<mutex>", cxx11
lock_guard, "<mutex>", cxx11
mutex, "<mutex>", cxx11
once_flag, "<mutex>", cxx11
recursive_mutex, "<mutex>", cxx11
recursive_timed_mutex, "<mutex>", cxx11
scoped_lock, "<mutex>", cxx17
timed_mutex, "<mutex>", cxx11
try_lock, "<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

File diff suppressed because it is too large Load diff