diff mbox series

[WIP,RFC] libstdc++: add module std

Message ID 20241018134821.998578-1-jason@redhat.com
State New
Headers show
Series [WIP,RFC] libstdc++: add module std | expand

Commit Message

Jason Merrill Oct. 18, 2024, 1:38 p.m. UTC
This patch is not ready for integration, but I'd like to get feedback on the
approach (and various specific questions below).

-- 8< --

This patch introduces an installed source form of module std and std.compat.
To find them, we install a libstdc++.modules.json file alongside
libstdc++.so, which tells the build system where the files are and any
special flags it should use when compiling them (none, in our case).  The
format is from a proposal in SG15.

The build system can find this file with
gcc -print-file-name=libstdc++.modules.json

It seems preferable to use a relative path from this file to the sources so
that moving the installation doesn't break the reference, but I didn't see
any obvious way to compute that without relying on coreutils, perl, or
python, so I wrote a POSIX shell script for it.

Currently this installs the sources under $(pkgdata), i.e.
/usr/share/libstdc++/modules.  It could also make sense to install them
under $(gxx_include_dir), i.e. /usr/include/c++/15/modules.  And/or the
subdirectory could be "miu" (module interface unit) instead of "modules".

The sources currently have the extension .cc, like other source files.
Alternatively, they could use one of the module interface unit extensions,
perhaps .ccm.

std.cc started with m.cencora's implementation in PR114600.  I've made some
adjustments, but more is probably desirable, e.g. of the <algorithm>
handling of namespace ranges, and to remove exports of templates that are
only specialized in a particular header.

The std module is missing exports for some newer headers, including some
that are already implemented (<generator>, <print>, <stop_token>).  I've
added some FIXMEs where I noticed missing bits.

Since bits/stdc++.h also intends to include the whole standard library, I
include it rather than duplicate it.  But stdc++.h comments out <exception>,
so I include it separately.  Alternatively, we could uncomment it in
stdc++.h.

stdc++.h also doesn't include the eternally deprecated <strstream>.  There
are some other deprecated facilities that I notice are included: <codecvt>
and float_denorm_style, at least.  It would be nice for L{E,}WG to clarify
whether module std is intended to include interfaces that were deprecated in
C++23, since ancient code isn't going to be relying on module std.

If they are supposed to included, do we also want to keep exporting them in
C++26, where they are removed from the standard?

It seemed most convenient for the two files to be monolithic so we don't
need to worry about include paths.  So the C library names that module
std.compat exports in both namespace std and :: in module are a block of
code that is identical in both files, adjusted based on whether the macro
STD_COMPAT is defined before the block.

In this implementation std.compat imports std; it would also be valid for it
to duplicate everything in std.  I see the libc++ std.compat also imports
std.

Is it useful for std.cc to live in a subdirectory of c++23 as in this patch, or
should it be in c++23 itself?  Or elsewhere?

This patch doesn't yet provide a convenient way for a user to find std.cc.

libstdc++-v3/ChangeLog:

	* src/c++23/Makefile.am: Add module std/std.compat.
	* src/c++23/Makefile.in: Regenerate.
	* src/c++23/modules/std.cc: New file.
	* src/c++23/modules/std.compat.cc: New file.
	* src/c++23/libstdc++.modules.json.in: New file.

contrib/ChangeLog:

	* relpath.sh: New file.
---
 libstdc++-v3/src/c++23/modules/std.cc         | 3575 +++++++++++++++++
 libstdc++-v3/src/c++23/modules/std.compat.cc  |  640 +++
 contrib/relpath.sh                            |   70 +
 libstdc++-v3/src/c++23/Makefile.am            |   18 +
 libstdc++-v3/src/c++23/Makefile.in            |  133 +-
 .../src/c++23/libstdc++.modules.json.in       |   17 +
 6 files changed, 4436 insertions(+), 17 deletions(-)
 create mode 100644 libstdc++-v3/src/c++23/modules/std.cc
 create mode 100644 libstdc++-v3/src/c++23/modules/std.compat.cc
 create mode 100755 contrib/relpath.sh
 create mode 100644 libstdc++-v3/src/c++23/libstdc++.modules.json.in


base-commit: 453d3d90c374d3bb329f1431b7dfb8d0510a88b9

Comments

Patrick Palka Oct. 18, 2024, 3:21 p.m. UTC | #1
On Fri, 18 Oct 2024, Jason Merrill wrote:

> This patch is not ready for integration, but I'd like to get feedback on the
> approach (and various specific questions below).
> 
> -- 8< --
> 
> This patch introduces an installed source form of module std and std.compat.
> To find them, we install a libstdc++.modules.json file alongside
> libstdc++.so, which tells the build system where the files are and any
> special flags it should use when compiling them (none, in our case).  The
> format is from a proposal in SG15.
> 
> The build system can find this file with
> gcc -print-file-name=libstdc++.modules.json
> 
> It seems preferable to use a relative path from this file to the sources so
> that moving the installation doesn't break the reference, but I didn't see
> any obvious way to compute that without relying on coreutils, perl, or
> python, so I wrote a POSIX shell script for it.
> 
> Currently this installs the sources under $(pkgdata), i.e.
> /usr/share/libstdc++/modules.  It could also make sense to install them
> under $(gxx_include_dir), i.e. /usr/include/c++/15/modules.  And/or the
> subdirectory could be "miu" (module interface unit) instead of "modules".
> 
> The sources currently have the extension .cc, like other source files.
> Alternatively, they could use one of the module interface unit extensions,
> perhaps .ccm.
> 
> std.cc started with m.cencora's implementation in PR114600.  I've made some
> adjustments, but more is probably desirable, e.g. of the <algorithm>
> handling of namespace ranges, and to remove exports of templates that are
> only specialized in a particular header.
> 
> The std module is missing exports for some newer headers, including some
> that are already implemented (<generator>, <print>, <stop_token>).  I've
> added some FIXMEs where I noticed missing bits.
> 
> Since bits/stdc++.h also intends to include the whole standard library, I
> include it rather than duplicate it.  But stdc++.h comments out <exception>,
> so I include it separately.  Alternatively, we could uncomment it in
> stdc++.h.
> 
> stdc++.h also doesn't include the eternally deprecated <strstream>.  There
> are some other deprecated facilities that I notice are included: <codecvt>
> and float_denorm_style, at least.  It would be nice for L{E,}WG to clarify
> whether module std is intended to include interfaces that were deprecated in
> C++23, since ancient code isn't going to be relying on module std.
> 
> If they are supposed to included, do we also want to keep exporting them in
> C++26, where they are removed from the standard?
> 
> It seemed most convenient for the two files to be monolithic so we don't
> need to worry about include paths.  So the C library names that module
> std.compat exports in both namespace std and :: in module are a block of
> code that is identical in both files, adjusted based on whether the macro
> STD_COMPAT is defined before the block.
> 
> In this implementation std.compat imports std; it would also be valid for it
> to duplicate everything in std.  I see the libc++ std.compat also imports
> std.
> 
> Is it useful for std.cc to live in a subdirectory of c++23 as in this patch, or
> should it be in c++23 itself?  Or elsewhere?

IIUC the src/ subdirectory is for stuff that gets compiled into the .so
which isn't the case here.  And if we want to support the std module in
C++20 mode as an extension, a c++23 subdirectory might not be ideal either.
Maybe libstdc++-v3/modules/ then?

> 
> This patch doesn't yet provide a convenient way for a user to find std.cc.
> 
> libstdc++-v3/ChangeLog:
> 
> 	* src/c++23/Makefile.am: Add module std/std.compat.
> 	* src/c++23/Makefile.in: Regenerate.
> 	* src/c++23/modules/std.cc: New file.
> 	* src/c++23/modules/std.compat.cc: New file.
> 	* src/c++23/libstdc++.modules.json.in: New file.
> 
> contrib/ChangeLog:
> 
> 	* relpath.sh: New file.
> ---
>  libstdc++-v3/src/c++23/modules/std.cc         | 3575 +++++++++++++++++
>  libstdc++-v3/src/c++23/modules/std.compat.cc  |  640 +++
>  contrib/relpath.sh                            |   70 +
>  libstdc++-v3/src/c++23/Makefile.am            |   18 +
>  libstdc++-v3/src/c++23/Makefile.in            |  133 +-
>  .../src/c++23/libstdc++.modules.json.in       |   17 +
>  6 files changed, 4436 insertions(+), 17 deletions(-)
>  create mode 100644 libstdc++-v3/src/c++23/modules/std.cc
>  create mode 100644 libstdc++-v3/src/c++23/modules/std.compat.cc
>  create mode 100755 contrib/relpath.sh
>  create mode 100644 libstdc++-v3/src/c++23/libstdc++.modules.json.in
> 
> diff --git a/libstdc++-v3/src/c++23/modules/std.cc b/libstdc++-v3/src/c++23/modules/std.cc
> new file mode 100644
> index 00000000000..d823b915b9c
> --- /dev/null
> +++ b/libstdc++-v3/src/c++23/modules/std.cc
> @@ -0,0 +1,3575 @@
> +// -*- C++ -*- [std.modules] module std
> +
> +// Copyright The GNU Toolchain Authors.
> +//
> +// This file is part of the GNU ISO C++ Library.  This library 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.
> +
> +// This library 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.
> +
> +// Under Section 7 of GPL version 3, you are granted additional
> +// permissions described in the GCC Runtime Library Exception, version
> +// 3.1, as published by the Free Software Foundation.
> +
> +// You should have received a copy of the GNU General Public License and
> +// a copy of the GCC Runtime Library Exception along with this program;
> +// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +// <http://www.gnu.org/licenses/>.
> +
> +module;
> +
> +#include <bits/stdc++.h>
> +
> +// ??? Commented out in stdc++.h
> +#include <execution>
> +
> +#undef __DEPRECATED
> +#include <strstream>
> +
> +export module std;
> +
> +// **** Any changes to the C library section below must also be made to the
> +// **** verbatim copy in std.compat.cc.
> +
> +// C standard library headers [tab:headers.cpp.c]
> +
> +#ifndef STD_COMPAT
> +#define C_LIB_NAMESPACE namespace std
> +#endif
> +
> +// 19.3 <cassert>
> +// No exports
> +
> +// 23.5.1 <cctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::isalnum;
> +  using std::isalpha;
> +  using std::isblank;
> +  using std::iscntrl;
> +  using std::isdigit;
> +  using std::isgraph;
> +  using std::islower;
> +  using std::isprint;
> +  using std::ispunct;
> +  using std::isspace;
> +  using std::isupper;
> +  using std::isxdigit;
> +  using std::tolower;
> +  using std::toupper;
> +}
> +
> +// 19.4 <cerrno>
> +// No exports
> +
> +// 28.3 <cfenv>
> +export C_LIB_NAMESPACE
> +{
> +  using std::feclearexcept;
> +  using std::fegetenv;
> +  using std::fegetexceptflag;
> +  using std::fegetround;
> +  using std::feholdexcept;
> +  using std::fenv_t;
> +  using std::feraiseexcept;
> +  using std::fesetenv;
> +  using std::fesetexceptflag;
> +  using std::fesetround;
> +  using std::fetestexcept;
> +  using std::feupdateenv;
> +  using std::fexcept_t;
> +}
> +
> +// 17.3.7 <cfloat> [cfloat.syn]
> +// No exports, only provides macros
> +
> +// 31.13.2 <cinttypes>
> +export C_LIB_NAMESPACE
> +{
> +  using std::imaxabs;
> +  using std::imaxdiv;
> +  using std::imaxdiv_t;
> +  using std::strtoimax;
> +  using std::strtoumax;
> +  using std::wcstoimax;
> +  using std::wcstoumax;
> +}
> +
> +// 17.3.6 <climits> [climits.syn]
> +// No exports, only provides macros
> +
> +// 30.5 <clocale>
> +export C_LIB_NAMESPACE
> +{
> +  using std::lconv;
> +  using std::localeconv;
> +  using std::setlocale;
> +  // LC_* macros not exported
> +}
> +
> +// 28.7.1 <cmath>
> +// FIXME missing special functions
> +export C_LIB_NAMESPACE
> +{
> +  using std::abs;
> +  using std::acos;
> +  using std::acosf;
> +  using std::acosh;
> +  using std::acoshf;
> +  using std::acoshl;
> +  using std::acosl;
> +  using std::asin;
> +  using std::asinf;
> +  using std::asinh;
> +  using std::asinhf;
> +  using std::asinhl;
> +  using std::asinl;
> +  using std::atan;
> +  using std::atan2;
> +  using std::atan2f;
> +  using std::atan2l;
> +  using std::atanf;
> +  using std::atanh;
> +  using std::atanhf;
> +  using std::atanhl;
> +  using std::atanl;
> +  using std::cbrt;
> +  using std::cbrtf;
> +  using std::cbrtl;
> +  using std::ceil;
> +  using std::ceilf;
> +  using std::ceill;
> +  using std::copysign;
> +  using std::copysignf;
> +  using std::copysignl;
> +  using std::cos;
> +  using std::cosf;
> +  using std::cosh;
> +  using std::coshf;
> +  using std::coshl;
> +  using std::cosl;
> +  using std::double_t;
> +  using std::erf;
> +  using std::erfc;
> +  using std::erfcf;
> +  using std::erfcl;
> +  using std::erff;
> +  using std::erfl;
> +  using std::exp;
> +  using std::exp2;
> +  using std::exp2f;
> +  using std::exp2l;
> +  using std::expf;
> +  using std::expl;
> +  using std::expm1;
> +  using std::expm1f;
> +  using std::expm1l;
> +  using std::fabs;
> +  using std::fabsf;
> +  using std::fabsl;
> +  using std::fdim;
> +  using std::fdimf;
> +  using std::fdiml;
> +  using std::float_t;
> +  using std::floor;
> +  using std::floorf;
> +  using std::floorl;
> +  using std::fma;
> +  using std::fmaf;
> +  using std::fmal;
> +  using std::fmax;
> +  using std::fmaxf;
> +  using std::fmaxl;
> +  using std::fmin;
> +  using std::fminf;
> +  using std::fminl;
> +  using std::fmod;
> +  using std::fmodf;
> +  using std::fmodl;
> +  using std::fpclassify;
> +  using std::frexp;
> +  using std::frexpf;
> +  using std::frexpl;
> +  using std::hypot;
> +  using std::hypotf;
> +  using std::hypotl;
> +  using std::ilogb;
> +  using std::ilogbf;
> +  using std::ilogbl;
> +  using std::isfinite;
> +  using std::isgreater;
> +  using std::isgreaterequal;
> +  using std::isinf;
> +  using std::isless;
> +  using std::islessequal;
> +  using std::islessgreater;
> +  using std::isnan;
> +  using std::isnormal;
> +  using std::isunordered;
> +  using std::ldexp;
> +  using std::ldexpf;
> +  using std::ldexpl;
> +#ifndef STD_COMPAT
> +  using std::lerp;
> +#endif
> +  using std::lgamma;
> +  using std::lgammaf;
> +  using std::lgammal;
> +  using std::llrint;
> +  using std::llrintf;
> +  using std::llrintl;
> +  using std::llround;
> +  using std::llroundf;
> +  using std::llroundl;
> +  using std::log;
> +  using std::log10;
> +  using std::log10f;
> +  using std::log10l;
> +  using std::log1p;
> +  using std::log1pf;
> +  using std::log1pl;
> +  using std::log2;
> +  using std::log2f;
> +  using std::log2l;
> +  using std::logb;
> +  using std::logbf;
> +  using std::logbl;
> +  using std::logf;
> +  using std::logl;
> +  using std::lrint;
> +  using std::lrintf;
> +  using std::lrintl;
> +  using std::lround;
> +  using std::lroundf;
> +  using std::lroundl;
> +  using std::modf;
> +  using std::modff;
> +  using std::modfl;
> +  using std::nan;
> +  using std::nanf;
> +  using std::nanl;
> +  using std::nearbyint;
> +  using std::nearbyintf;
> +  using std::nearbyintl;
> +  using std::nextafter;
> +  using std::nextafterf;
> +  using std::nextafterl;
> +  using std::nexttoward;
> +  using std::nexttowardf;
> +  using std::nexttowardl;
> +  using std::pow;
> +  using std::powf;
> +  using std::powl;
> +  using std::remainder;
> +  using std::remainderf;
> +  using std::remainderl;
> +  using std::remquo;
> +  using std::remquof;
> +  using std::remquol;
> +  using std::rint;
> +  using std::rintf;
> +  using std::rintl;
> +  using std::round;
> +  using std::roundf;
> +  using std::roundl;
> +  using std::scalbln;
> +  using std::scalblnf;
> +  using std::scalblnl;
> +  using std::scalbn;
> +  using std::scalbnf;
> +  using std::scalbnl;
> +  using std::signbit;
> +  using std::sin;
> +  using std::sinf;
> +  using std::sinh;
> +  using std::sinhf;
> +  using std::sinhl;
> +  using std::sinl;
> +  using std::sqrt;
> +  using std::sqrtf;
> +  using std::sqrtl;
> +  using std::tan;
> +  using std::tanf;
> +  using std::tanh;
> +  using std::tanhf;
> +  using std::tanhl;
> +  using std::tanl;
> +  using std::tgamma;
> +  using std::tgammaf;
> +  using std::tgammal;
> +  using std::trunc;
> +  using std::truncf;
> +  using std::truncl;
> +}
> +
> +// 17.13.3 <csetjmp>
> +export C_LIB_NAMESPACE
> +{
> +  using std::jmp_buf;
> +  using std::longjmp;
> +  // setjmp macro not exported
> +}
> +
> +// 17.13.4 <csignal>
> +export C_LIB_NAMESPACE
> +{
> +  using std::raise;
> +  using std::sig_atomic_t;
> +  using std::signal;
> +  // SIG_* macros not exported
> +}
> +
> +// 17.13.2 <cstdarg>
> +export C_LIB_NAMESPACE
> +{
> +  using std::va_list;
> +  // va_arg and friend macros not exported
> +}
> +
> +// 17.2.1 <cstddef> [cstddef.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::max_align_t;
> +  using std::nullptr_t;
> +  using std::ptrdiff_t;
> +  using std::size_t;
> +#ifndef STD_COMPAT
> +  using std::byte;
> +  using std::operator<<=;
> +  using std::operator<<;
> +  using std::operator>>=;
> +  using std::operator>>;
> +  using std::operator|=;
> +  using std::operator|;
> +  using std::operator&=;
> +  using std::operator&;
> +  using std::operator^=;
> +  using std::operator^;
> +  using std::operator~;
> +  using std::to_integer;
> +#endif
> +  // NULL and offsetof macros not exported
> +}
> +
> +// 17.4 <cstdint>
> +export C_LIB_NAMESPACE
> +{
> +  using std::int8_t;
> +  using std::int16_t;
> +  using std::int32_t;
> +  using std::int64_t;
> +  using std::int_fast16_t;
> +  using std::int_fast32_t;
> +  using std::int_fast64_t;
> +  using std::int_fast8_t;
> +  using std::int_least16_t;
> +  using std::int_least32_t;
> +  using std::int_least64_t;
> +  using std::int_least8_t;
> +  using std::intmax_t;
> +  using std::intptr_t;
> +  using std::uint8_t;
> +  using std::uint16_t;
> +  using std::uint32_t;
> +  using std::uint64_t;
> +  using std::uint_fast16_t;
> +  using std::uint_fast32_t;
> +  using std::uint_fast64_t;
> +  using std::uint_fast8_t;
> +  using std::uint_least16_t;
> +  using std::uint_least32_t;
> +  using std::uint_least64_t;
> +  using std::uint_least8_t;
> +  using std::uintmax_t;
> +  using std::uintptr_t;
> +}
> +
> +// 31.13.1 <cstdio>
> +export C_LIB_NAMESPACE
> +{
> +  using std::clearerr;
> +  using std::fclose;
> +  using std::feof;
> +  using std::ferror;
> +  using std::fflush;
> +  using std::fgetc;
> +  using std::fgetpos;
> +  using std::fgets;
> +  using std::FILE;
> +  using std::fopen;
> +  using std::fpos_t;
> +  using std::fprintf;
> +  using std::fputc;
> +  using std::fputs;
> +  using std::fread;
> +  using std::freopen;
> +  using std::fscanf;
> +  using std::fseek;
> +  using std::fsetpos;
> +  using std::ftell;
> +  using std::fwrite;
> +  using std::getc;
> +  using std::getchar;
> +  using std::perror;
> +  using std::printf;
> +  using std::putc;
> +  using std::putchar;
> +  using std::puts;
> +  using std::remove;
> +  using std::rename;
> +  using std::rewind;
> +  using std::scanf;
> +  using std::setbuf;
> +  using std::setvbuf;
> +  using std::size_t;
> +  using std::snprintf;
> +  using std::sprintf;
> +  using std::sscanf;
> +  using std::tmpfile;
> +  using std::tmpnam;
> +  using std::ungetc;
> +  using std::vfprintf;
> +  using std::vfscanf;
> +  using std::vprintf;
> +  using std::vscanf;
> +  using std::vsnprintf;
> +  using std::vsprintf;
> +  using std::vsscanf;
> +}
> +
> +// 17.2.2 <cstdlib> [cstdlib.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::_Exit;
> +  using std::abort;
> +  using std::abs;
> +  using std::aligned_alloc;
> +  using std::at_quick_exit;
> +  using std::atexit;
> +  using std::atof;
> +  using std::atoi;
> +  using std::atol;
> +  using std::atoll;
> +  using std::bsearch;
> +  using std::calloc;
> +  using std::div;
> +  using std::div_t;
> +  using std::exit;
> +  using std::free;
> +  using std::getenv;
> +  using std::labs;
> +  using std::ldiv;
> +  using std::ldiv_t;
> +  using std::llabs;
> +  using std::lldiv;
> +  using std::lldiv_t;
> +  using std::malloc;
> +  using std::mblen;
> +  using std::mbstowcs;
> +  using std::mbtowc;
> +  using std::qsort;
> +  using std::quick_exit;
> +  using std::rand;
> +  using std::realloc;
> +  using std::size_t;
> +  using std::srand;
> +  using std::strtod;
> +  using std::strtof;
> +  using std::strtol;
> +  using std::strtold;
> +  using std::strtoll;
> +  using std::strtoul;
> +  using std::strtoull;
> +  using std::system;
> +  using std::wcstombs;
> +  using std::wctomb;
> +}
> +
> +// 23.5.3 <cstring>
> +export C_LIB_NAMESPACE
> +{
> +  using std::memchr;
> +  using std::memcmp;
> +  using std::memcpy;
> +  using std::memmove;
> +  using std::memset;
> +  using std::size_t;
> +  using std::strcat;
> +  using std::strchr;
> +  using std::strcmp;
> +  using std::strcoll;
> +  using std::strcpy;
> +  using std::strcspn;
> +  using std::strerror;
> +  using std::strlen;
> +  using std::strncat;
> +  using std::strncmp;
> +  using std::strncpy;
> +  using std::strpbrk;
> +  using std::strrchr;
> +  using std::strspn;
> +  using std::strstr;
> +  using std::strtok;
> +  using std::strxfrm;
> +}
> +
> +// 29.15 <ctime>
> +export C_LIB_NAMESPACE
> +{
> +  using std::asctime;
> +  using std::clock;
> +  using std::clock_t;
> +  using std::ctime;
> +  using std::difftime;
> +  using std::gmtime;
> +  using std::localtime;
> +  using std::mktime;
> +  using std::size_t;
> +  using std::strftime;
> +  using std::time;
> +  using std::time_t;
> +  using std::timespec;
> +  using std::tm;
> +  using std::timespec_get;
> +}
> +
> +// 23.5.5 <cuchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::mbrtoc8;
> +  using std::c8rtomb;
> +  using std::mbrtoc16;
> +  using std::c16rtomb;
> +  using std::mbrtoc32;
> +  using std::c32rtomb;
> +}
> +
> +// 23.5.4 <cwchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::btowc;
> +  using std::fgetwc;
> +  using std::fgetws;
> +  using std::fputwc;
> +  using std::fputws;
> +  using std::fwide;
> +  using std::fwprintf;
> +  using std::fwscanf;
> +  using std::getwc;
> +  using std::getwchar;
> +  using std::mbrlen;
> +  using std::mbrtowc;
> +  using std::mbsinit;
> +  using std::mbsrtowcs;
> +  using std::mbstate_t;
> +  using std::putwc;
> +  using std::putwchar;
> +  using std::size_t;
> +  using std::swprintf;
> +  using std::swscanf;
> +  using std::tm;
> +  using std::ungetwc;
> +  using std::vfwprintf;
> +  using std::vfwscanf;
> +  using std::vswprintf;
> +  using std::vswscanf;
> +  using std::vwprintf;
> +  using std::vwscanf;
> +  using std::wcrtomb;
> +  using std::wcscat;
> +  using std::wcschr;
> +  using std::wcscmp;
> +  using std::wcscoll;
> +  using std::wcscpy;
> +  using std::wcscspn;
> +  using std::wcsftime;
> +  using std::wcslen;
> +  using std::wcsncat;
> +  using std::wcsncmp;
> +  using std::wcsncpy;
> +  using std::wcspbrk;
> +  using std::wcsrchr;
> +  using std::wcsrtombs;
> +  using std::wcsspn;
> +  using std::wcsstr;
> +  using std::wcstod;
> +  using std::wcstof;
> +  using std::wcstok;
> +  using std::wcstol;
> +  using std::wcstold;
> +  using std::wcstoll;
> +  using std::wcstoul;
> +  using std::wcstoull;
> +  using std::wcsxfrm;
> +  using std::wctob;
> +  using std::wint_t;
> +  using std::wmemchr;
> +  using std::wmemcmp;
> +  using std::wmemcpy;
> +  using std::wmemmove;
> +  using std::wmemset;
> +  using std::wprintf;
> +  using std::wscanf;
> +}
> +
> +// 23.5.2 <cwctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::iswalnum;
> +  using std::iswalpha;
> +  using std::iswblank;
> +  using std::iswcntrl;
> +  using std::iswctype;
> +  using std::iswdigit;
> +  using std::iswgraph;
> +  using std::iswlower;
> +  using std::iswprint;
> +  using std::iswpunct;
> +  using std::iswspace;
> +  using std::iswupper;
> +  using std::iswxdigit;
> +  using std::towctrans;
> +  using std::towlower;
> +  using std::towupper;
> +  using std::wctrans;
> +  using std::wctrans_t;
> +  using std::wctype;
> +  using std::wctype_t;
> +  using std::wint_t;
> +}
> +
> +// **** End of C library ****
> +
> +// 27.4 <algorithm>
> +export namespace std
> +{
> +  namespace ranges
> +  {
> +    using std::ranges::in_found_result;
> +    using std::ranges::in_fun_result;
> +    using std::ranges::in_in_out_result;
> +    using std::ranges::in_in_result;
> +    using std::ranges::in_out_out_result;
> +    using std::ranges::in_out_result;
> +    using std::ranges::min_max_result;
> +  }
> +  using std::all_of;
> +  namespace ranges
> +  {
> +    using std::ranges::all_of;
> +  }
> +  using std::any_of;
> +  namespace ranges
> +  {
> +    using std::ranges::any_of;
> +  }
> +  using std::none_of;
> +  namespace ranges
> +  {
> +    using std::ranges::none_of;
> +  }
> +  using std::for_each;
> +  namespace ranges
> +  {
> +    using std::ranges::for_each;
> +    using std::ranges::for_each_result;
> +  }
> +  using std::for_each_n;
> +  namespace ranges
> +  {
> +    using std::ranges::for_each_n;
> +    using std::ranges::for_each_n_result;
> +  }
> +  using std::find;
> +  using std::find_if;
> +  using std::find_if_not;
> +  namespace ranges
> +  {
> +    using std::ranges::find;
> +    using std::ranges::find_if;
> +    using std::ranges::find_if_not;
> +  }
> +  using std::find_end;
> +  namespace ranges
> +  {
> +    using std::ranges::find_end;
> +  }
> +  using std::find_first_of;
> +  namespace ranges
> +  {
> +    using std::ranges::find_first_of;
> +  }
> +  using std::adjacent_find;
> +  namespace ranges
> +  {
> +    using std::ranges::adjacent_find;
> +  }
> +  using std::count;
> +  using std::count_if;
> +  namespace ranges
> +  {
> +    using std::ranges::count;
> +    using std::ranges::count_if;
> +  }
> +  using std::mismatch;
> +  namespace ranges
> +  {
> +    using std::ranges::mismatch;
> +    using std::ranges::mismatch_result;
> +  }
> +  using std::equal;
> +  namespace ranges
> +  {
> +    using std::ranges::equal;
> +  }
> +  using std::is_permutation;
> +  namespace ranges
> +  {
> +    using std::ranges::is_permutation;
> +  }
> +  using std::search;
> +  namespace ranges
> +  {
> +    using std::ranges::search;
> +  }
> +  using std::search_n;
> +  namespace ranges
> +  {
> +    using std::ranges::search_n;
> +  }
> +  namespace ranges
> +  {}

Empty namespace (here and twice more below)?

> +  using std::copy;
> +  namespace ranges
> +  {
> +    using std::ranges::copy;
> +    using std::ranges::copy_result;
> +  }
> +  using std::copy_n;
> +  namespace ranges
> +  {
> +    using std::ranges::copy_n;
> +    using std::ranges::copy_n_result;
> +  }
> +  using std::copy_if;
> +  namespace ranges
> +  {
> +    using std::ranges::copy_if;
> +    using std::ranges::copy_if_result;
> +  }
> +  using std::copy_backward;
> +  namespace ranges
> +  {
> +    using std::ranges::copy_backward;
> +    using std::ranges::copy_backward_result;
> +  }
> +  using std::move;
> +  namespace ranges
> +  {
> +    using std::ranges::move;
> +    using std::ranges::move_result;
> +  }
> +  using std::move_backward;
> +  namespace ranges
> +  {
> +    using std::ranges::move_backward;
> +    using std::ranges::move_backward_result;
> +  }
> +  using std::swap_ranges;
> +  namespace ranges
> +  {
> +    using std::ranges::swap_ranges;
> +    using std::ranges::swap_ranges_result;
> +  }
> +  using std::iter_swap;
> +  using std::transform;
> +  namespace ranges
> +  {
> +    using std::ranges::binary_transform_result;
> +    using std::ranges::transform;
> +    using std::ranges::unary_transform_result;
> +  }
> +  using std::replace;
> +  using std::replace_if;
> +  namespace ranges
> +  {
> +    using std::ranges::replace;
> +    using std::ranges::replace_if;
> +  }
> +  using std::replace_copy;
> +  using std::replace_copy_if;
> +  namespace ranges
> +  {
> +    using std::ranges::replace_copy;
> +    using std::ranges::replace_copy_if;
> +    using std::ranges::replace_copy_if_result;
> +    using std::ranges::replace_copy_result;
> +  }
> +  using std::fill;
> +  using std::fill_n;
> +  namespace ranges
> +  {
> +    using std::ranges::fill;
> +    using std::ranges::fill_n;
> +  }
> +  using std::generate;
> +  using std::generate_n;
> +  namespace ranges
> +  {
> +    using std::ranges::generate;
> +    using std::ranges::generate_n;
> +  }
> +  using std::remove;
> +  using std::remove_if;
> +  namespace ranges
> +  {
> +    using std::ranges::remove;
> +    using std::ranges::remove_if;
> +  }
> +  using std::remove_copy;
> +  using std::remove_copy_if;
> +  namespace ranges
> +  {
> +    using std::ranges::remove_copy;
> +    using std::ranges::remove_copy_if;
> +    using std::ranges::remove_copy_if_result;
> +    using std::ranges::remove_copy_result;
> +  }
> +  using std::unique;
> +  namespace ranges
> +  {
> +    using std::ranges::unique;
> +  }
> +  using std::unique_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::unique_copy;
> +    using std::ranges::unique_copy_result;
> +  }
> +  using std::reverse;
> +  namespace ranges
> +  {
> +    using std::ranges::reverse;
> +  }
> +  using std::reverse_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::reverse_copy;
> +    using std::ranges::reverse_copy_result;
> +  }
> +  using std::rotate;
> +  namespace ranges
> +  {
> +    using std::ranges::rotate;
> +  }
> +  using std::rotate_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::rotate_copy;
> +    using std::ranges::rotate_copy_result;
> +  }
> +  using std::sample;
> +  namespace ranges
> +  {
> +    using std::ranges::sample;
> +  }
> +  using std::shuffle;
> +  namespace ranges
> +  {
> +    using std::ranges::shuffle;
> +  }
> +  using std::shift_left;
> +  namespace ranges
> +  {}
> +  using std::shift_right;
> +  namespace ranges
> +  {}
> +  using std::sort;
> +  namespace ranges
> +  {
> +    using std::ranges::sort;
> +  }
> +  using std::stable_sort;
> +  namespace ranges
> +  {
> +    using std::ranges::stable_sort;
> +  }
> +  using std::partial_sort;
> +  namespace ranges
> +  {
> +    using std::ranges::partial_sort;
> +  }
> +  using std::partial_sort_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::partial_sort_copy;
> +    using std::ranges::partial_sort_copy_result;
> +  }
> +  using std::is_sorted;
> +  using std::is_sorted_until;
> +  namespace ranges
> +  {
> +    using std::ranges::is_sorted;
> +    using std::ranges::is_sorted_until;
> +  }
> +  using std::nth_element;
> +  namespace ranges
> +  {
> +    using std::ranges::nth_element;
> +  }
> +  using std::lower_bound;
> +  namespace ranges
> +  {
> +    using std::ranges::lower_bound;
> +  }
> +  using std::upper_bound;
> +  namespace ranges
> +  {
> +    using std::ranges::upper_bound;
> +  }
> +  using std::equal_range;
> +  namespace ranges
> +  {
> +    using std::ranges::equal_range;
> +  }
> +  using std::binary_search;
> +  namespace ranges
> +  {
> +    using std::ranges::binary_search;
> +  }
> +  using std::is_partitioned;
> +  namespace ranges
> +  {
> +    using std::ranges::is_partitioned;
> +  }
> +  using std::partition;
> +  namespace ranges
> +  {
> +    using std::ranges::partition;
> +  }
> +  using std::stable_partition;
> +  namespace ranges
> +  {
> +    using std::ranges::stable_partition;
> +  }
> +  using std::partition_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::partition_copy;
> +    using std::ranges::partition_copy_result;
> +  }
> +  using std::partition_point;
> +  namespace ranges
> +  {
> +    using std::ranges::partition_point;
> +  }
> +  using std::merge;
> +  namespace ranges
> +  {
> +    using std::ranges::merge;
> +    using std::ranges::merge_result;
> +  }
> +  using std::inplace_merge;
> +  namespace ranges
> +  {
> +    using std::ranges::inplace_merge;
> +  }
> +  using std::includes;
> +  namespace ranges
> +  {
> +    using std::ranges::includes;
> +  }
> +  using std::set_union;
> +  namespace ranges
> +  {
> +    using std::ranges::set_union;
> +    using std::ranges::set_union_result;
> +  }
> +  using std::set_intersection;
> +  namespace ranges
> +  {
> +    using std::ranges::set_intersection;
> +    using std::ranges::set_intersection_result;
> +  }
> +  using std::set_difference;
> +  namespace ranges
> +  {
> +    using std::ranges::set_difference;
> +    using std::ranges::set_difference_result;
> +  }
> +  using std::set_symmetric_difference;
> +  namespace ranges
> +  {
> +    using std::ranges::set_symmetric_difference;
> +    using std::ranges::set_symmetric_difference_result;
> +  }
> +  using std::push_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::push_heap;
> +  }
> +  using std::pop_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::pop_heap;
> +  }
> +  using std::make_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::make_heap;
> +  }
> +  using std::sort_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::sort_heap;
> +  }
> +  using std::is_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::is_heap;
> +  }
> +  using std::is_heap_until;
> +  namespace ranges
> +  {
> +    using std::ranges::is_heap_until;
> +  }
> +  using std::min;
> +  namespace ranges
> +  {
> +    using std::ranges::min;
> +  }
> +  using std::max;
> +  namespace ranges
> +  {
> +    using std::ranges::max;
> +  }
> +  using std::minmax;
> +  namespace ranges
> +  {
> +    using std::ranges::minmax;
> +    using std::ranges::minmax_result;
> +  }
> +  using std::min_element;
> +  namespace ranges
> +  {
> +    using std::ranges::min_element;
> +  }
> +  using std::max_element;
> +  namespace ranges
> +  {
> +    using std::ranges::max_element;
> +  }
> +  using std::minmax_element;
> +  namespace ranges
> +  {
> +    using std::ranges::minmax_element;
> +    using std::ranges::minmax_element_result;
> +  }
> +  using std::clamp;
> +  namespace ranges
> +  {
> +    using std::ranges::clamp;
> +  }
> +  using std::lexicographical_compare;
> +  namespace ranges
> +  {
> +    using std::ranges::lexicographical_compare;
> +  }
> +  using std::lexicographical_compare_three_way;
> +  using std::next_permutation;
> +  namespace ranges
> +  {
> +    using std::ranges::next_permutation;
> +    using std::ranges::next_permutation_result;
> +  }
> +  using std::prev_permutation;
> +  namespace ranges
> +  {
> +    using std::ranges::prev_permutation;
> +    using std::ranges::prev_permutation_result;
> +  }
> +}
> +
> +// 22.7.2 <any>
> +#if __cpp_lib_any

Just wondering, why are only some exports guarded by their feature-test
macro?  Relatedly would we want to support the std module as an
extension in C++20 mode and to that end guard all C++23 exports?

> +export namespace std
> +{
> +  using std::any;
> +  using std::any_cast;
> +  using std::bad_any_cast;
> +  using std::make_any;
> +  using std::swap;
> +}
> +#endif
> +
> +// 24.3.2 <array>
> +export namespace std
> +{
> +  using std::array;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::get;
> +  using std::swap;
> +  using std::to_array;
> +  using std::tuple_element;
> +  using std::tuple_size;
> +}
> +
> +// 33.5.2 <atomic>
> +export namespace std
> +{
> +  using std::atomic;
> +  using std::atomic_bool;
> +  using std::atomic_char;
> +  using std::atomic_char16_t;
> +  using std::atomic_char32_t;
> +  using std::atomic_char8_t;
> +  using std::atomic_compare_exchange_strong;
> +  using std::atomic_compare_exchange_strong_explicit;
> +  using std::atomic_compare_exchange_weak;
> +  using std::atomic_compare_exchange_weak_explicit;
> +  using std::atomic_exchange;
> +  using std::atomic_exchange_explicit;
> +  using std::atomic_fetch_add;
> +  using std::atomic_fetch_add_explicit;
> +  using std::atomic_fetch_and;
> +  using std::atomic_fetch_and_explicit;
> +  using std::atomic_fetch_or;
> +  using std::atomic_fetch_or_explicit;
> +  using std::atomic_fetch_sub;
> +  using std::atomic_fetch_sub_explicit;
> +  using std::atomic_fetch_xor;
> +  using std::atomic_fetch_xor_explicit;
> +  using std::atomic_flag;
> +  using std::atomic_flag_clear;
> +  using std::atomic_flag_clear_explicit;
> +  using std::atomic_flag_notify_all;
> +  using std::atomic_flag_notify_one;
> +  using std::atomic_flag_test;
> +  using std::atomic_flag_test_and_set;
> +  using std::atomic_flag_test_and_set_explicit;
> +  using std::atomic_flag_test_explicit;
> +  using std::atomic_flag_wait;
> +  using std::atomic_flag_wait_explicit;
> +  using std::atomic_init;
> +  using std::atomic_int;
> +  using std::atomic_int16_t;
> +  using std::atomic_int32_t;
> +  using std::atomic_int64_t;
> +  using std::atomic_int8_t;
> +  using std::atomic_int_fast16_t;
> +  using std::atomic_int_fast32_t;
> +  using std::atomic_int_fast64_t;
> +  using std::atomic_int_fast8_t;
> +  using std::atomic_int_least16_t;
> +  using std::atomic_int_least32_t;
> +  using std::atomic_int_least64_t;
> +  using std::atomic_int_least8_t;
> +  using std::atomic_intmax_t;
> +  using std::atomic_intptr_t;
> +  using std::atomic_is_lock_free;
> +  using std::atomic_llong;
> +  using std::atomic_load;
> +  using std::atomic_load_explicit;
> +  using std::atomic_long;
> +  using std::atomic_notify_all;
> +  using std::atomic_notify_one;
> +  using std::atomic_ptrdiff_t;
> +  using std::atomic_schar;
> +  using std::atomic_short;
> +  using std::atomic_signal_fence;
> +  using std::atomic_signed_lock_free;
> +  using std::atomic_size_t;
> +  using std::atomic_store;
> +  using std::atomic_store_explicit;
> +  using std::atomic_thread_fence;
> +  using std::atomic_uchar;
> +  using std::atomic_uint;
> +  using std::atomic_uint16_t;
> +  using std::atomic_uint32_t;
> +  using std::atomic_uint64_t;
> +  using std::atomic_uint8_t;
> +  using std::atomic_uint_fast16_t;
> +  using std::atomic_uint_fast32_t;
> +  using std::atomic_uint_fast64_t;
> +  using std::atomic_uint_fast8_t;
> +  using std::atomic_uint_least16_t;
> +  using std::atomic_uint_least32_t;
> +  using std::atomic_uint_least64_t;
> +  using std::atomic_uint_least8_t;
> +  using std::atomic_uintmax_t;
> +  using std::atomic_uintptr_t;
> +  using std::atomic_ullong;
> +  using std::atomic_ulong;
> +  using std::atomic_unsigned_lock_free;
> +  using std::atomic_ushort;
> +  using std::atomic_wait;
> +  using std::atomic_wait_explicit;
> +  using std::atomic_wchar_t;
> +  using std::kill_dependency;
> +  using std::memory_order;
> +  using std::memory_order_acq_rel;
> +  using std::memory_order_acquire;
> +  using std::memory_order_consume;
> +  using std::memory_order_relaxed;
> +  using std::memory_order_release;
> +  using std::memory_order_seq_cst;
> +  // ATOMIC_*_LOCK_FREE not exported
> +}
> +
> +// 33.9.3 <barrier>
> +#if __cpp_lib_barrier
> +export namespace std
> +{
> +  using std::barrier;
> +}
> +#endif
> +
> +// 22.15 <bit>
> +export namespace std
> +{
> +  using std::bit_cast;
> +  using std::bit_ceil;
> +  using std::bit_floor;
> +  using std::bit_width;
> +  using std::countl_one;
> +  using std::countl_zero;
> +  using std::countr_one;
> +  using std::countr_zero;
> +  using std::endian;
> +  using std::has_single_bit;
> +  using std::popcount;
> +  using std::rotl;
> +  using std::rotr;
> +}
> +
> +// 22.9 <bitset>
> +#if __cpp_lib_bitset
> +export namespace std
> +{
> +  using std::bitset;
> +  using std::operator&;
> +  using std::operator|;
> +  using std::operator^;
> +  using std::operator>>;
> +  using std::operator<<;
> +  using std::hash;
> +}
> +#endif
> +
> +// 22.13 <charconv>
> +export namespace std
> +{
> +  using std::chars_format;
> +  using std::operator&;
> +  using std::operator&=;
> +  using std::operator^;
> +  using std::operator^=;
> +  using std::operator|;
> +  using std::operator|=;
> +  using std::operator~;
> +  using std::from_chars;
> +  using std::from_chars_result;
> +  using std::to_chars;
> +  using std::to_chars_result;
> +}
> +
> +// 29.2 <chrono>
> +#if __cpp_lib_chrono
> +export namespace std
> +{
> +  namespace chrono
> +  {
> +    using std::chrono::duration;
> +    using std::chrono::time_point;
> +  }
> +  using std::common_type;
> +  namespace chrono
> +  {
> +    using std::chrono::duration_values;
> +    using std::chrono::treat_as_floating_point;
> +    using std::chrono::treat_as_floating_point_v;
> +    using std::chrono::operator+;
> +    using std::chrono::operator-;
> +    using std::chrono::operator*;
> +    using std::chrono::operator/;
> +    using std::chrono::operator%;
> +    using std::chrono::operator==;
> +    using std::chrono::operator<;
> +    using std::chrono::operator>;
> +    using std::chrono::operator<=;
> +    using std::chrono::operator>=;
> +    using std::chrono::operator<=>;
> +    using std::chrono::ceil;
> +    using std::chrono::duration_cast;
> +    using std::chrono::floor;
> +    using std::chrono::round;
> +    using std::chrono::operator<<;
> +    using std::chrono::abs;
> +    using std::chrono::day;
> +    using std::chrono::days;
> +    using std::chrono::file_clock;
> +    using std::chrono::file_time;
> +    using std::chrono::hh_mm_ss;
> +    using std::chrono::high_resolution_clock;
> +    using std::chrono::hours;
> +    using std::chrono::is_am;
> +    using std::chrono::is_pm;
> +    using std::chrono::last_spec;
> +    using std::chrono::local_days;
> +    using std::chrono::local_seconds;
> +    using std::chrono::local_t;
> +    using std::chrono::local_time;
> +    using std::chrono::make12;
> +    using std::chrono::make24;
> +    using std::chrono::microseconds;
> +    using std::chrono::milliseconds;
> +    using std::chrono::minutes;
> +    using std::chrono::month;
> +    using std::chrono::month_day;
> +    using std::chrono::month_day_last;
> +    using std::chrono::month_weekday;
> +    using std::chrono::month_weekday_last;
> +    using std::chrono::months;
> +    using std::chrono::nanoseconds;
> +    using std::chrono::seconds;
> +    using std::chrono::steady_clock;
> +    using std::chrono::sys_days;
> +    using std::chrono::sys_seconds;
> +    using std::chrono::sys_time;
> +    using std::chrono::system_clock;
> +    using std::chrono::time_point_cast;
> +    using std::chrono::weekday;
> +    using std::chrono::weekday_indexed;
> +    using std::chrono::weekday_last;
> +    using std::chrono::weeks;
> +    using std::chrono::year;
> +    using std::chrono::year_month;
> +    using std::chrono::year_month_day;
> +    using std::chrono::year_month_day_last;
> +    using std::chrono::year_month_weekday;
> +    using std::chrono::year_month_weekday_last;
> +    using std::chrono::years;
> +  }
> +  using std::formatter;
> +  namespace chrono
> +  {
> +    using std::chrono::April;
> +    using std::chrono::August;
> +    using std::chrono::December;
> +    using std::chrono::February;
> +    using std::chrono::Friday;
> +    using std::chrono::January;
> +    using std::chrono::July;
> +    using std::chrono::June;
> +    using std::chrono::last;
> +    using std::chrono::March;
> +    using std::chrono::May;
> +    using std::chrono::Monday;
> +    using std::chrono::November;
> +    using std::chrono::October;
> +    using std::chrono::Saturday;
> +    using std::chrono::September;
> +    using std::chrono::Sunday;
> +    using std::chrono::Thursday;
> +    using std::chrono::Tuesday;
> +    using std::chrono::Wednesday;
> +  }
> +}
> +export namespace std::inline literals::inline chrono_literals
> +{
> +  using std::literals::chrono_literals::operator""h;
> +  using std::literals::chrono_literals::operator""min;
> +  using std::literals::chrono_literals::operator""s;
> +  using std::literals::chrono_literals::operator""ms;
> +  using std::literals::chrono_literals::operator""us;
> +  using std::literals::chrono_literals::operator""ns;
> +  using std::literals::chrono_literals::operator""d;
> +  using std::literals::chrono_literals::operator""y;
> +}
> +#endif // __cpp_lib_chrono
> +
> +// <codecvt>: deprecated C++17, removed C++26
> +export namespace std
> +{
> +  using std::codecvt_mode;
> +  using std::codecvt_utf16;
> +  using std::codecvt_utf8;
> +  using std::codecvt_utf8_utf16;
> +}
> +
> +// 17.11.1 <compare>
> +#if __cpp_lib_three_way_comparison
> +export namespace std
> +{
> +  using std::common_comparison_category;
> +  using std::common_comparison_category_t;
> +  using std::compare_three_way;
> +  using std::compare_three_way_result;
> +  using std::compare_three_way_result_t;
> +  using std::is_eq;
> +  using std::is_gt;
> +  using std::is_gteq;
> +  using std::is_lt;
> +  using std::is_lteq;
> +  using std::is_neq;
> +  using std::partial_ordering;
> +  using std::strong_ordering;
> +  using std::three_way_comparable;
> +  using std::three_way_comparable_with;
> +  using std::weak_ordering;
> +  using std::compare_partial_order_fallback;
> +  using std::compare_strong_order_fallback;
> +  using std::compare_weak_order_fallback;
> +  using std::partial_order;
> +  using std::strong_order;
> +  using std::weak_order;
> +}
> +#endif // __cpp_lib_three_way_comparison
> +
> +// 28.4 <complex>
> +export namespace std
> +{
> +  using std::complex;
> +  using std::operator+;
> +  using std::operator-;
> +  using std::operator*;
> +  using std::operator/;
> +  using std::operator==;
> +  using std::operator>>;
> +  using std::operator<<;
> +  using std::abs;
> +  using std::acos;
> +  using std::acosh;
> +  using std::arg;
> +  using std::asin;
> +  using std::asinh;
> +  using std::atan;
> +  using std::atanh;
> +  using std::conj;
> +  using std::cos;
> +  using std::cosh;
> +  using std::exp;
> +  using std::imag;
> +  using std::log;
> +  using std::log10;
> +  using std::norm;
> +  using std::polar;
> +  using std::pow;
> +  using std::proj;
> +  using std::real;
> +  using std::sin;
> +  using std::sinh;
> +  using std::sqrt;
> +  using std::tan;
> +  using std::tanh;
> +  using std::operator""il;
> +  using std::operator""i;
> +  using std::operator""if;
> +}
> +
> +// 18 <concepts>
> +#if __cpp_lib_concepts
> +export namespace std
> +{
> +  using std::assignable_from;
> +  using std::common_reference_with;
> +  using std::common_with;
> +  using std::convertible_to;
> +  using std::derived_from;
> +  using std::floating_point;
> +  using std::integral;
> +  using std::same_as;
> +  using std::signed_integral;
> +  using std::unsigned_integral;
> +  namespace ranges
> +  {
> +    using std::ranges::swap;
> +  }
> +  using std::constructible_from;
> +  using std::copy_constructible;
> +  using std::copyable;
> +  using std::default_initializable;
> +  using std::destructible;
> +  using std::equality_comparable;
> +  using std::equality_comparable_with;
> +  using std::equivalence_relation;
> +  using std::invocable;
> +  using std::movable;
> +  using std::move_constructible;
> +  using std::predicate;
> +  using std::regular;
> +  using std::regular_invocable;
> +  using std::relation;
> +  using std::semiregular;
> +  using std::strict_weak_order;
> +  using std::swappable;
> +  using std::swappable_with;
> +  using std::totally_ordered;
> +  using std::totally_ordered_with;
> +}
> +#endif
> +
> +// 33.7 <condition_variable>
> +export namespace std
> +{
> +  using std::condition_variable;
> +  using std::condition_variable_any;
> +  using std::cv_status;
> +  using std::notify_all_at_thread_exit;
> +}
> +
> +// 17.12.2 <coroutine>
> +#if __cpp_lib_coroutine
> +export namespace std
> +{
> +  using std::coroutine_handle;
> +  using std::coroutine_traits;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::hash;
> +  using std::noop_coroutine;
> +  using std::noop_coroutine_handle;
> +  using std::noop_coroutine_promise;
> +  using std::suspend_always;
> +  using std::suspend_never;
> +}
> +#endif // __cpp_lib_coroutine
> +
> +// 22.16 <debugging>
> +#if __cpp_lib_debugging
> +export namespace std
> +{
> +  using std::breakpoint;
> +  using std::breakpoint_if_debugging;
> +  using std::is_debugger_present;
> +}
> +#endif
> +
> +// 24.3 <deque>
> +export namespace std
> +{
> +  using std::deque;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::deque;
> +  }
> +}
> +
> +// 17.9.2 <exception>
> +export namespace std
> +{
> +  using std::bad_exception;
> +  using std::current_exception;
> +  using std::exception;
> +  using std::exception_ptr;
> +  using std::get_terminate;
> +  using std::make_exception_ptr;
> +  using std::nested_exception;
> +  using std::rethrow_exception;
> +  using std::rethrow_if_nested;
> +  using std::set_terminate;
> +  using std::terminate;
> +  using std::terminate_handler;
> +  using std::throw_with_nested;
> +  using std::uncaught_exception;
> +  using std::uncaught_exceptions;
> +}
> +
> +// 34.4 <execution>
> +#if __cpp_lib_execution
> +export namespace std
> +{
> +  using std::is_execution_policy;
> +  using std::is_execution_policy_v;
> +  namespace execution
> +  {
> +    using std::execution::sequenced_policy;
> +    using std::execution::parallel_policy;
> +    using std::execution::parallel_unsequenced_policy;
> +    using std::execution::unsequenced_policy;
> +    using std::execution::seq;
> +    using std::execution::par;
> +    using std::execution::par_unseq;
> +    using std::execution::unseq;
> +  }
> +#if __cpp_lib_senders
> +  using std::forwarding_query_t;
> +  using std::get_allocator_t;
> +  using std::get_stop_token_t;
> +  using std::forwarding_query;
> +  using std::get_allocator;
> +  using std::get_stop_token;
> +  using std::stop_token_of_t;
> +  namespace execution
> +  {
> +    using std::execution::get_domain_t;
> +    using std::execution::get_scheduler_t;
> +    using std::execution::get_delegation_scheduler_t;
> +    using std::execution::get_forward_progress_guarantee_t;
> +    using std::execution::get_completion_scheduler_t;
> +    using std::execution::get_domain;
> +    using std::execution::get_scheduler;
> +    using std::execution::get_delegation_scheduler;
> +    using std::execution::forward_progress_guarantee;
> +    using std::execution::get_forward_progress_guarantee;
> +    using std::execution::get_completion_scheduler;
> +    using std::execution::empty_env;
> +    using std::execution::get_env_t;
> +    using std::execution::get_env;
> +    using std::execution::env_of_t;
> +    using std::execution::default_domain;
> +    using std::execution::scheduler_t;
> +    using std::execution::scheduler;
> +    using std::execution::receiver_t;
> +    using std::execution::receiver;
> +    using std::execution::receiver_of;
> +    using std::execution::set_value_t;
> +    using std::execution::set_error_t;
> +    using std::execution::set_stopped_t;
> +    using std::execution::set_value;
> +    using std::execution::set_error;
> +    using std::execution::set_stopped;
> +    using std::execution::operation_state_t;
> +    using std::execution::operation_state;
> +    using std::execution::start_t;
> +    using std::execution::start;
> +    using std::execution::sender_t;
> +    using std::execution::sender;
> +    using std::execution::sender_in;
> +    using std::execution::sender_to;
> +    using std::execution::get_completion_signatures_t;
> +    using std::execution::get_completion_signatures;
> +    using std::execution::completion_signatures_of_t;
> +    using std::execution::value_types_of_t;
> +    using std::execution::error_types_of_t;
> +    using std::execution::sends_stopped;
> +    using std::execution::tag_of_t;
> +    using std::execution::transform_sender;
> +    using std::execution::transform_env;
> +    using std::execution::apply_sender;
> +    using std::execution::connect_t;
> +    using std::execution::connect;
> +    using std::execution::connect_result_t;
> +    using std::execution::just_t;
> +    using std::execution::just_error_t;
> +    using std::execution::just_stopped_t;
> +    using std::execution::schedule_t;
> +    using std::execution::just;
> +    using std::execution::just_error;
> +    using std::execution::just_stopped;
> +    using std::execution::schedule;
> +    using std::execution::read_env;
> +    using std::execution::schedule_result_t;
> +    using std::execution::sender_adaptor_closure;
> +    using std::execution::starts_on_t;
> +    using std::execution::continues_on_t;
> +    using std::execution::on_t;
> +    using std::execution::schedule_from_t;
> +    using std::execution::then_t;
> +    using std::execution::upon_error_t;
> +    using std::execution::upon_stopped_t;
> +    using std::execution::let_value_t;
> +    using std::execution::let_error_t;
> +    using std::execution::let_stopped_t;
> +    using std::execution::bulk_t;
> +    using std::execution::split_t;
> +    using std::execution::when_all_t;
> +    using std::execution::when_all_with_variant_t;
> +    using std::execution::into_variant_t;
> +    using std::execution::stopped_as_optional_t;
> +    using std::execution::stopped_as_error_t;
> +    using std::execution::starts_on;
> +    using std::execution::continues_on;
> +    using std::execution::on;
> +    using std::execution::schedule_from;
> +    using std::execution::then;
> +    using std::execution::upon_error;
> +    using std::execution::upon_stopped;
> +    using std::execution::let_value;
> +    using std::execution::let_error;
> +    using std::execution::let_stopped;
> +    using std::execution::bulk;
> +    using std::execution::split;
> +    using std::execution::when_all;
> +    using std::execution::when_all_with_variant;
> +    using std::execution::into_variant;
> +    using std::execution::stopped_as_optional;
> +    using std::execution::stopped_as_error;
> +    using std::execution::completion_signatures;
> +    using std::execution::transform_completion_signatures;
> +    using std::execution::transform_completion_signatures_of;
> +    using std::execution::run_loop;
> +  }
> +  namespace this_thread
> +  {
> +    using std::this_thread::sync_wait_t;
> +    using std::this_thread::sync_wait_with_variant_t;
> +    using std::this_thread::sync_wait;
> +    using std::this_thread::sync_wait_with_variant;
> +  }
> +#endif // __cpp_lib_senders
> +}
> +#endif // __cpp_lib_execution
> +
> +// 22.8 <expected>
> +#if __cpp_lib_expected
> +export namespace std
> +{
> +  using std::unexpected;
> +  using std::bad_expected_access;
> +  using std::unexpect_t;
> +  using std::unexpect;
> +  using std::expected;
> +}
> +#endif
> +
> +// <filesystem>
> +#if __cpp_lib_filesystem
> +export namespace std::filesystem
> +{
> +  using std::filesystem::begin;
> +  using std::filesystem::copy_options;
> +  using std::filesystem::directory_entry;
> +  using std::filesystem::directory_iterator;
> +  using std::filesystem::directory_options;
> +  using std::filesystem::end;
> +  using std::filesystem::file_status;
> +  using std::filesystem::file_time_type;
> +  using std::filesystem::file_type;
> +  using std::filesystem::filesystem_error;
> +  using std::filesystem::hash_value;
> +  using std::filesystem::path;
> +  using std::filesystem::perm_options;
> +  using std::filesystem::perms;
> +  using std::filesystem::recursive_directory_iterator;
> +  using std::filesystem::space_info;
> +  using std::filesystem::swap;
> +  using std::filesystem::operator&;
> +  using std::filesystem::operator&=;
> +  using std::filesystem::operator^;
> +  using std::filesystem::operator^=;
> +  using std::filesystem::operator|;
> +  using std::filesystem::operator|=;
> +  using std::filesystem::operator~;
> +  using std::filesystem::absolute;
> +  using std::filesystem::canonical;
> +  using std::filesystem::copy;
> +  using std::filesystem::copy_file;
> +  using std::filesystem::copy_symlink;
> +  using std::filesystem::create_directories;
> +  using std::filesystem::create_directory;
> +  using std::filesystem::create_directory_symlink;
> +  using std::filesystem::create_hard_link;
> +  using std::filesystem::create_symlink;
> +  using std::filesystem::current_path;
> +  using std::filesystem::equivalent;
> +  using std::filesystem::exists;
> +  using std::filesystem::file_size;
> +  using std::filesystem::hard_link_count;
> +  using std::filesystem::is_block_file;
> +  using std::filesystem::is_character_file;
> +  using std::filesystem::is_directory;
> +  using std::filesystem::is_empty;
> +  using std::filesystem::is_fifo;
> +  using std::filesystem::is_other;
> +  using std::filesystem::is_regular_file;
> +  using std::filesystem::is_socket;
> +  using std::filesystem::is_symlink;
> +  using std::filesystem::last_write_time;
> +  using std::filesystem::permissions;
> +  using std::filesystem::proximate;
> +  using std::filesystem::read_symlink;
> +  using std::filesystem::relative;
> +  using std::filesystem::remove;
> +  using std::filesystem::remove_all;
> +  using std::filesystem::rename;
> +  using std::filesystem::resize_file;
> +  using std::filesystem::space;
> +  using std::filesystem::status;
> +  using std::filesystem::status_known;
> +  using std::filesystem::symlink_status;
> +  using std::filesystem::temp_directory_path;
> +  using std::filesystem::u8path;
> +  using std::filesystem::weakly_canonical;
> +}
> +#endif // __cpp_lib_filesystem
> +
> +// <flat_map>
> +
> +// <flat_set>
> +
> +// <format>
> +export namespace std
> +{
> +  using std::basic_format_arg;
> +  using std::basic_format_args;
> +  using std::basic_format_context;
> +  using std::basic_format_parse_context;
> +  using std::basic_format_string;
> +  using std::format;
> +  using std::format_args;
> +  using std::format_context;
> +  using std::format_error;
> +  using std::format_parse_context;
> +  using std::format_string;
> +  using std::format_to;
> +  using std::format_to_n;
> +  using std::format_to_n_result;
> +  using std::formatted_size;
> +  using std::formatter;
> +  using std::make_format_args;
> +  using std::make_wformat_args;
> +  using std::vformat;
> +  using std::vformat_to;
> +  using std::visit_format_arg;
> +  using std::wformat_args;
> +  using std::wformat_context;
> +  using std::wformat_parse_context;
> +  using std::wformat_string;
> +}
> +
> +// <forward_list>
> +export namespace std
> +{
> +  using std::forward_list;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::forward_list;
> +  }
> +}
> +
> +// <fstream>
> +export namespace std
> +{
> +  using std::basic_filebuf;
> +  using std::basic_fstream;
> +  using std::basic_ifstream;
> +  using std::basic_ofstream;
> +  using std::filebuf;
> +  using std::fstream;
> +  using std::ifstream;
> +  using std::ofstream;
> +  using std::swap;
> +  using std::wfilebuf;
> +  using std::wfstream;
> +  using std::wifstream;
> +  using std::wofstream;
> +}
> +
> +// <functional>
> +export namespace std
> +{
> +  using std::bind;
> +  using std::bind_front;
> +  using std::bit_and;
> +  using std::bit_not;
> +  using std::bit_or;
> +  using std::bit_xor;
> +  using std::compare_three_way;
> +  using std::cref;
> +  using std::divides;
> +  using std::equal_to;
> +  using std::greater;
> +  using std::greater_equal;
> +  using std::identity;
> +  using std::invoke;
> +  using std::is_bind_expression;
> +  using std::is_bind_expression_v;
> +  using std::is_placeholder;
> +  using std::is_placeholder_v;
> +  using std::less;
> +  using std::less_equal;
> +  using std::logical_and;
> +  using std::logical_not;
> +  using std::logical_or;
> +  using std::minus;
> +  using std::modulus;
> +  using std::multiplies;
> +  using std::negate;
> +  using std::not_equal_to;
> +  using std::not_fn;
> +  using std::plus;
> +  using std::ref;
> +  using std::reference_wrapper;
> +  namespace placeholders
> +  {
> +    using std::placeholders::_1;
> +    using std::placeholders::_10;
> +    using std::placeholders::_2;
> +    using std::placeholders::_3;
> +    using std::placeholders::_4;
> +    using std::placeholders::_5;
> +    using std::placeholders::_6;
> +    using std::placeholders::_7;
> +    using std::placeholders::_8;
> +    using std::placeholders::_9;
> +  }
> +  using std::bad_function_call;
> +  using std::function;
> +  using std::mem_fn;
> +  using std::swap;
> +  using std::operator==;
> +  using std::boyer_moore_horspool_searcher;
> +  using std::boyer_moore_searcher;
> +  using std::default_searcher;
> +  using std::hash;
> +  namespace ranges
> +  {
> +    using std::ranges::equal_to;
> +    using std::ranges::greater;
> +    using std::ranges::greater_equal;
> +    using std::ranges::less;
> +    using std::ranges::less_equal;
> +    using std::ranges::not_equal_to;
> +  }
> +}
> +
> +// <future>
> +export namespace std
> +{
> +  using std::future_errc;
> +  using std::future_status;
> +  using std::launch;
> +  using std::operator&;
> +  using std::operator&=;
> +  using std::operator^;
> +  using std::operator^=;
> +  using std::operator|;
> +  using std::operator|=;
> +  using std::operator~;
> +  using std::async;
> +  using std::future;
> +  using std::future_category;
> +  using std::future_error;
> +  using std::is_error_code_enum;
> +  using std::make_error_code;
> +  using std::make_error_condition;
> +  using std::packaged_task;
> +  using std::promise;
> +  using std::shared_future;
> +  using std::swap;
> +  using std::uses_allocator;
> +}
> +
> +// <generator> FIXME
> +
> +// <hazard_pointer> FIXME
> +
> +// 17.10.2 <initializer_list>
> +export namespace std
> +{
> +  using std::begin;
> +  using std::end;
> +  using std::initializer_list;
> +}
> +
> +// <inplace_vector> FIXME
> +
> +// <iomanip>
> +export namespace std
> +{
> +  using std::get_money;
> +  using std::get_time;
> +  using std::put_money;
> +  using std::put_time;
> +  using std::quoted;
> +  using std::resetiosflags;
> +  using std::setbase;
> +  using std::setfill;
> +  using std::setiosflags;
> +  using std::setprecision;
> +  using std::setw;
> +}
> +
> +// <ios>
> +export namespace std
> +{
> +  using std::fpos;
> +  using std::operator!=;
> +  using std::operator-;
> +  using std::operator==;
> +  using std::basic_ios;
> +  using std::boolalpha;
> +  using std::dec;
> +  using std::defaultfloat;
> +  using std::fixed;
> +  using std::hex;
> +  using std::hexfloat;
> +  using std::internal;
> +  using std::io_errc;
> +  using std::ios;
> +  using std::ios_base;
> +  using std::iostream_category;
> +  using std::is_error_code_enum;
> +  using std::left;
> +  using std::make_error_code;
> +  using std::make_error_condition;
> +  using std::noboolalpha;
> +  using std::noshowbase;
> +  using std::noshowpoint;
> +  using std::noshowpos;
> +  using std::noskipws;
> +  using std::nounitbuf;
> +  using std::nouppercase;
> +  using std::oct;
> +  using std::right;
> +  using std::scientific;
> +  using std::showbase;
> +  using std::showpoint;
> +  using std::showpos;
> +  using std::skipws;
> +  using std::streamoff;
> +  using std::streamsize;
> +  using std::unitbuf;
> +  using std::uppercase;
> +  using std::wios;
> +}
> +
> +// <iosfwd>
> +export namespace std
> +{
> +  using std::streampos;
> +  using std::u16streampos;
> +  using std::u32streampos;
> +  using std::u8streampos;
> +  using std::wstreampos;
> +  using std::basic_osyncstream;
> +  using std::basic_syncbuf;
> +  using std::istreambuf_iterator;
> +  using std::ostreambuf_iterator;
> +  using std::osyncstream;
> +  using std::syncbuf;
> +  using std::wosyncstream;
> +  using std::wsyncbuf;
> +  using std::fpos;
> +}
> +
> +// <iostream>
> +export namespace std
> +{
> +  using std::cerr;
> +  using std::cin;
> +  using std::clog;
> +  using std::cout;
> +  using std::wcerr;
> +  using std::wcin;
> +  using std::wclog;
> +  using std::wcout;
> +}
> +
> +// <istream>
> +export namespace std
> +{
> +  using std::basic_iostream;
> +  using std::basic_istream;
> +  using std::iostream;
> +  using std::istream;
> +  using std::wiostream;
> +  using std::wistream;
> +  using std::ws;
> +  using std::operator>>;
> +}
> +
> +// <iterator>
> +export namespace std
> +{
> +  using std::incrementable_traits;
> +  using std::indirectly_readable_traits;
> +  using std::iter_difference_t;
> +  using std::iter_reference_t;
> +  using std::iter_value_t;
> +  using std::iterator_traits;
> +  namespace ranges
> +  {
> +    using std::ranges::iter_move;
> +    using std::ranges::iter_swap;
> +  }
> +  using std::advance;
> +  using std::bidirectional_iterator;
> +  using std::bidirectional_iterator_tag;
> +  using std::contiguous_iterator;
> +  using std::contiguous_iterator_tag;
> +  using std::disable_sized_sentinel_for;
> +  using std::distance;
> +  using std::forward_iterator;
> +  using std::forward_iterator_tag;
> +  using std::incrementable;
> +  using std::indirect_binary_predicate;
> +  using std::indirect_equivalence_relation;
> +  using std::indirect_result_t;
> +  using std::indirect_strict_weak_order;
> +  using std::indirect_unary_predicate;
> +  using std::indirectly_comparable;
> +  using std::indirectly_copyable;
> +  using std::indirectly_copyable_storable;
> +  using std::indirectly_movable;
> +  using std::indirectly_movable_storable;
> +  using std::indirectly_readable;
> +  using std::indirectly_regular_unary_invocable;
> +  using std::indirectly_swappable;
> +  using std::indirectly_unary_invocable;
> +  using std::indirectly_writable;
> +  using std::input_iterator;
> +  using std::input_iterator_tag;
> +  using std::input_or_output_iterator;
> +  using std::iter_common_reference_t;
> +  using std::iter_rvalue_reference_t;
> +  using std::mergeable;
> +  using std::next;
> +  using std::output_iterator;
> +  using std::output_iterator_tag;
> +  using std::permutable;
> +  using std::prev;
> +  using std::projected;
> +  using std::random_access_iterator;
> +  using std::random_access_iterator_tag;
> +  using std::sentinel_for;
> +  using std::sized_sentinel_for;
> +  using std::sortable;
> +  using std::weakly_incrementable;
> +  namespace ranges
> +  {
> +    using std::ranges::advance;
> +    using std::ranges::distance;
> +    using std::ranges::next;
> +    using std::ranges::prev;
> +  }
> +  using std::reverse_iterator;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::operator-;
> +  using std::operator+;
> +  using std::back_insert_iterator;
> +  using std::back_inserter;
> +  using std::begin;
> +  using std::cbegin;
> +  using std::cend;
> +  using std::common_iterator;
> +  using std::counted_iterator;
> +  using std::crbegin;
> +  using std::crend;
> +  using std::data;
> +  using std::default_sentinel;
> +  using std::default_sentinel_t;
> +  using std::empty;
> +  using std::end;
> +  using std::front_insert_iterator;
> +  using std::front_inserter;
> +  using std::insert_iterator;
> +  using std::inserter;
> +  using std::istream_iterator;
> +  using std::istreambuf_iterator;
> +  using std::iterator;
> +  using std::make_move_iterator;
> +  using std::make_reverse_iterator;
> +  using std::move_iterator;
> +  using std::move_sentinel;
> +  using std::ostream_iterator;
> +  using std::ostreambuf_iterator;
> +  using std::rbegin;
> +  using std::rend;
> +  using std::size;
> +  using std::ssize;
> +  using std::unreachable_sentinel;
> +  using std::unreachable_sentinel_t;
> +}
> +
> +// <latch>
> +export namespace std
> +{
> +  using std::latch;
> +}
> +
> +// 17.3.3 <limits> [limits.syn]
> +export namespace std
> +{
> +  using std::float_denorm_style; // deprecated in C++23
> +  using std::float_round_style;
> +  using std::numeric_limits;
> +}
> +
> +// FIXME <linalg>
> +
> +// <list>
> +export namespace std
> +{
> +  using std::list;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::list;
> +  }
> +}
> +
> +// <locale>
> +export namespace std
> +{
> +  using std::codecvt;
> +  using std::codecvt_base;
> +  using std::codecvt_byname;
> +  using std::collate;
> +  using std::collate_byname;
> +  using std::ctype;
> +  using std::ctype_base;
> +  using std::ctype_byname;
> +  using std::has_facet;
> +  using std::isalnum;
> +  using std::isalpha;
> +  using std::isblank;
> +  using std::iscntrl;
> +  using std::isdigit;
> +  using std::isgraph;
> +  using std::islower;
> +  using std::isprint;
> +  using std::ispunct;
> +  using std::isspace;
> +  using std::isupper;
> +  using std::isxdigit;
> +  using std::locale;
> +  using std::messages;
> +  using std::messages_base;
> +  using std::messages_byname;
> +  using std::money_base;
> +  using std::money_get;
> +  using std::money_put;
> +  using std::moneypunct;
> +  using std::moneypunct_byname;
> +  using std::num_get;
> +  using std::num_put;
> +  using std::numpunct;
> +  using std::numpunct_byname;
> +  using std::time_base;
> +  using std::time_get;
> +  using std::time_get_byname;
> +  using std::time_put;
> +  using std::time_put_byname;
> +  using std::tolower;
> +  using std::toupper;
> +  using std::use_facet;
> +  using std::wbuffer_convert;
> +  using std::wstring_convert;
> +}
> +
> +// <map>
> +export namespace std
> +{
> +  using std::map;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase_if;
> +  using std::multimap;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::map;
> +    using std::pmr::multimap;
> +  }
> +}
> +
> +// FIXME <mdspan>
> +
> +// 20.2 <memory>
> +export namespace std
> +{
> +  using std::align;
> +  using std::allocator;
> +  using std::allocator_arg;
> +  using std::allocator_arg_t;
> +  using std::allocator_traits;
> +  using std::assume_aligned;
> +  using std::make_obj_using_allocator;
> +  using std::pointer_traits;
> +  using std::to_address;
> +  using std::uninitialized_construct_using_allocator;
> +  using std::uses_allocator;
> +  using std::uses_allocator_construction_args;
> +  using std::uses_allocator_v;
> +  using std::operator==;
> +  using std::addressof;
> +  using std::uninitialized_default_construct;
> +  using std::uninitialized_default_construct_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_default_construct;
> +    using std::ranges::uninitialized_default_construct_n;
> +  }
> +  using std::uninitialized_value_construct;
> +  using std::uninitialized_value_construct_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_value_construct;
> +    using std::ranges::uninitialized_value_construct_n;
> +  }
> +  using std::uninitialized_copy;
> +  using std::uninitialized_copy_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_copy;
> +    using std::ranges::uninitialized_copy_n;
> +    using std::ranges::uninitialized_copy_n_result;
> +    using std::ranges::uninitialized_copy_result;
> +  }
> +  using std::uninitialized_move;
> +  using std::uninitialized_move_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_move;
> +    using std::ranges::uninitialized_move_n;
> +    using std::ranges::uninitialized_move_n_result;
> +    using std::ranges::uninitialized_move_result;
> +  }
> +  using std::uninitialized_fill;
> +  using std::uninitialized_fill_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_fill;
> +    using std::ranges::uninitialized_fill_n;
> +  }
> +  using std::construct_at;
> +  namespace ranges
> +  {
> +    using std::ranges::construct_at;
> +  }
> +  using std::destroy;
> +  using std::destroy_at;
> +  using std::destroy_n;
> +  namespace ranges
> +  {
> +    using std::ranges::destroy;
> +    using std::ranges::destroy_at;
> +    using std::ranges::destroy_n;
> +  }
> +  using std::default_delete;
> +  using std::make_unique;
> +  using std::make_unique_for_overwrite;
> +  using std::unique_ptr;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::allocate_shared;
> +  using std::allocate_shared_for_overwrite;
> +  using std::bad_weak_ptr;
> +  using std::const_pointer_cast;
> +  using std::dynamic_pointer_cast;
> +  using std::make_shared;
> +  using std::make_shared_for_overwrite;
> +  using std::reinterpret_pointer_cast;
> +  using std::shared_ptr;
> +  using std::static_pointer_cast;
> +  using std::swap;
> +  using std::get_deleter;
> +  using std::atomic_compare_exchange_strong;
> +  using std::atomic_compare_exchange_strong_explicit;
> +  using std::atomic_compare_exchange_weak;
> +  using std::atomic_compare_exchange_weak_explicit;
> +  using std::atomic_exchange;
> +  using std::atomic_exchange_explicit;
> +  using std::atomic_is_lock_free;
> +  using std::atomic_load;
> +  using std::atomic_load_explicit;
> +  using std::atomic_store;
> +  using std::atomic_store_explicit;
> +  using std::enable_shared_from_this;
> +  using std::hash;
> +  using std::owner_less;
> +  using std::weak_ptr;
> +}
> +
> +// 20.4 <memory_resource>
> +export namespace std::pmr
> +{
> +  using std::pmr::memory_resource;
> +  using std::pmr::operator==;
> +  using std::pmr::get_default_resource;
> +  using std::pmr::monotonic_buffer_resource;
> +  using std::pmr::new_delete_resource;
> +  using std::pmr::null_memory_resource;
> +  using std::pmr::polymorphic_allocator;
> +  using std::pmr::pool_options;
> +  using std::pmr::set_default_resource;
> +  using std::pmr::synchronized_pool_resource;
> +  using std::pmr::unsynchronized_pool_resource;
> +}
> +
> +// <mutex>
> +export namespace std
> +{
> +  using std::adopt_lock;
> +  using std::adopt_lock_t;
> +  using std::call_once;
> +  using std::defer_lock;
> +  using std::defer_lock_t;
> +  using std::lock;
> +  using std::lock_guard;
> +  using std::mutex;
> +  using std::once_flag;
> +  using std::recursive_mutex;
> +  using std::recursive_timed_mutex;
> +  using std::scoped_lock;
> +  using std::swap;
> +  using std::timed_mutex;
> +  using std::try_lock;
> +  using std::try_to_lock;
> +  using std::try_to_lock_t;
> +  using std::unique_lock;
> +}
> +
> +// 17.6.2 <new> [new.syn]
> +export namespace std
> +{
> +  using std::align_val_t;
> +  using std::bad_alloc;
> +  using std::bad_array_new_length;
> +  using std::destroying_delete;
> +  using std::destroying_delete_t;
> +  using std::get_new_handler;
> +  using std::hardware_destructive_interference_size;
> +  using std::hardware_constructive_interference_size;
> +  using std::launder;
> +  using std::new_handler;
> +  using std::nothrow;
> +  using std::nothrow_t;
> +  using std::set_new_handler;
> +}
> +export
> +{
> +  using ::operator new;
> +  using ::operator delete;
> +  using ::operator new[];
> +  using ::operator delete[];
> +}
> +
> +// <numbers>
> +export namespace std::numbers
> +{
> +  using std::numbers::e;
> +  using std::numbers::e_v;
> +  using std::numbers::egamma;
> +  using std::numbers::egamma_v;
> +  using std::numbers::inv_pi;
> +  using std::numbers::inv_pi_v;
> +  using std::numbers::inv_sqrt3;
> +  using std::numbers::inv_sqrt3_v;
> +  using std::numbers::inv_sqrtpi;
> +  using std::numbers::inv_sqrtpi_v;
> +  using std::numbers::ln10;
> +  using std::numbers::ln10_v;
> +  using std::numbers::ln2;
> +  using std::numbers::ln2_v;
> +  using std::numbers::log10e;
> +  using std::numbers::log10e_v;
> +  using std::numbers::log2e;
> +  using std::numbers::log2e_v;
> +  using std::numbers::phi;
> +  using std::numbers::phi_v;
> +  using std::numbers::pi;
> +  using std::numbers::pi_v;
> +  using std::numbers::sqrt2;
> +  using std::numbers::sqrt2_v;
> +  using std::numbers::sqrt3;
> +  using std::numbers::sqrt3_v;
> +}
> +
> +// <numeric>
> +export namespace std
> +{
> +  using std::accumulate;
> +  using std::adjacent_difference;
> +  using std::exclusive_scan;
> +  using std::inclusive_scan;
> +  using std::inner_product;
> +  using std::iota;
> +  using std::partial_sum;
> +  using std::reduce;
> +  using std::transform_exclusive_scan;
> +  using std::transform_inclusive_scan;
> +  using std::transform_reduce;
> +  using std::gcd;
> +  using std::lcm;
> +  using std::midpoint;
> +}
> +
> +// <optional>
> +export namespace std
> +{
> +  using std::bad_optional_access;
> +  using std::nullopt;
> +  using std::nullopt_t;
> +  using std::optional;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::hash;
> +  using std::make_optional;
> +  using std::swap;
> +}
> +
> +// <ostream>
> +export namespace std
> +{
> +  using std::basic_ostream;
> +  using std::endl;
> +  using std::ends;
> +  using std::flush;
> +  using std::ostream;
> +  using std::wostream;
> +  using std::operator<<;
> +}
> +
> +// FIXME <print>
> +
> +// <queue>
> +export namespace std
> +{
> +  using std::queue;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::priority_queue;
> +  using std::swap;
> +  using std::uses_allocator;
> +}
> +
> +// <random>
> +export namespace std
> +{
> +  using std::bernoulli_distribution;
> +  using std::binomial_distribution;
> +  using std::cauchy_distribution;
> +  using std::chi_squared_distribution;
> +  using std::default_random_engine;
> +  using std::discard_block_engine;
> +  using std::discrete_distribution;
> +  using std::exponential_distribution;
> +  using std::extreme_value_distribution;
> +  using std::fisher_f_distribution;
> +  using std::gamma_distribution;
> +  using std::generate_canonical;
> +  using std::geometric_distribution;
> +  using std::independent_bits_engine;
> +  using std::knuth_b;
> +  using std::linear_congruential_engine;
> +  using std::lognormal_distribution;
> +  using std::mersenne_twister_engine;
> +  using std::minstd_rand;
> +  using std::minstd_rand0;
> +  using std::mt19937;
> +  using std::mt19937_64;
> +  using std::negative_binomial_distribution;
> +  using std::normal_distribution;
> +  using std::piecewise_constant_distribution;
> +  using std::piecewise_linear_distribution;
> +  using std::poisson_distribution;
> +  using std::random_device;
> +  using std::ranlux24;
> +  using std::ranlux24_base;
> +  using std::ranlux48;
> +  using std::ranlux48_base;
> +  using std::seed_seq;
> +  using std::shuffle_order_engine;
> +  using std::student_t_distribution;
> +  using std::subtract_with_carry_engine;
> +  using std::uniform_int_distribution;
> +  using std::uniform_random_bit_generator;
> +  using std::uniform_real_distribution;
> +  using std::weibull_distribution;
> +}
> +
> +// <ranges>
> +export namespace std
> +{
> +  namespace ranges
> +  {
> +    using std::ranges::begin;
> +    using std::ranges::cbegin;
> +    using std::ranges::cdata;
> +    using std::ranges::cend;
> +    using std::ranges::crbegin;
> +    using std::ranges::crend;
> +    using std::ranges::data;
> +    using std::ranges::empty;
> +    using std::ranges::end;
> +    using std::ranges::rbegin;
> +    using std::ranges::rend;
> +    using std::ranges::size;
> +    using std::ranges::ssize;
> +    using std::ranges::bidirectional_range;
> +    using std::ranges::borrowed_range;
> +    using std::ranges::common_range;
> +    using std::ranges::contiguous_range;
> +    using std::ranges::disable_sized_range;
> +    using std::ranges::enable_borrowed_range;
> +    using std::ranges::enable_view;
> +    using std::ranges::forward_range;
> +    using std::ranges::get;
> +    using std::ranges::input_range;
> +    using std::ranges::iterator_t;
> +    using std::ranges::output_range;
> +    using std::ranges::random_access_range;
> +    using std::ranges::range;
> +    using std::ranges::range_common_reference_t;
> +    using std::ranges::range_difference_t;
> +    using std::ranges::range_reference_t;
> +    using std::ranges::range_rvalue_reference_t;
> +    using std::ranges::range_size_t;
> +    using std::ranges::range_value_t;
> +    using std::ranges::sentinel_t;
> +    using std::ranges::sized_range;
> +    using std::ranges::subrange;
> +    using std::ranges::subrange_kind;
> +    using std::ranges::view;
> +    using std::ranges::view_base;
> +    using std::ranges::view_interface;
> +    using std::ranges::viewable_range;
> +  }
> +  using std::ranges::get;
> +  namespace ranges
> +  {
> +    using std::ranges::borrowed_iterator_t;
> +    using std::ranges::borrowed_subrange_t;
> +    using std::ranges::dangling;
> +    using std::ranges::empty_view;
> +    namespace views
> +    {
> +      using std::ranges::views::empty;
> +    }
> +    using std::ranges::single_view;
> +    namespace views
> +    {
> +      using std::ranges::views::single;
> +    }
> +    using std::ranges::iota_view;
> +    namespace views
> +    {
> +      using std::ranges::views::iota;
> +    }
> +    using std::ranges::basic_istream_view;
> +    using std::ranges::istream_view;
> +    using std::ranges::wistream_view;
> +    namespace views
> +    {
> +      using std::ranges::views::istream;
> +    }
> +    namespace views
> +    {
> +      using std::ranges::views::all;
> +      using std::ranges::views::all_t;
> +    }
> +    using std::ranges::filter_view;
> +    using std::ranges::owning_view;
> +    using std::ranges::ref_view;
> +    namespace views
> +    {
> +      using std::ranges::views::filter;
> +    }
> +    using std::ranges::transform_view;
> +    namespace views
> +    {
> +      using std::ranges::views::transform;
> +    }
> +    using std::ranges::take_view;
> +    namespace views
> +    {
> +      using std::ranges::views::take;
> +    }
> +    using std::ranges::take_while_view;
> +    namespace views
> +    {
> +      using std::ranges::views::take_while;
> +    }
> +    using std::ranges::drop_view;
> +    namespace views
> +    {
> +      using std::ranges::views::drop;
> +    }
> +    using std::ranges::drop_while_view;
> +    namespace views
> +    {
> +      using std::ranges::views::drop_while;
> +    }
> +    using std::ranges::join_view;
> +    namespace views
> +    {
> +      using std::ranges::views::join;
> +    }
> +    using std::ranges::lazy_split_view;
> +    using std::ranges::split_view;
> +    namespace views
> +    {
> +      using std::ranges::views::lazy_split;
> +      using std::ranges::views::split;
> +    }
> +    namespace views
> +    {
> +      using std::ranges::views::counted;
> +    }
> +    using std::ranges::common_view;
> +    namespace views
> +    {
> +      using std::ranges::views::common;
> +    }
> +    using std::ranges::reverse_view;
> +    namespace views
> +    {
> +      using std::ranges::views::reverse;
> +    }
> +    using std::ranges::elements_view;
> +    using std::ranges::keys_view;
> +    using std::ranges::values_view;
> +    namespace views
> +    {
> +      using std::ranges::views::elements;
> +      using std::ranges::views::keys;
> +      using std::ranges::views::values;
> +    }
> +  }
> +  namespace views = ranges::views;
> +  using std::tuple_element;
> +  using std::tuple_size;
> +}
> +
> +// <ratio>
> +export namespace std
> +{
> +  using std::atto;
> +  using std::centi;
> +  using std::deca;
> +  using std::deci;
> +  using std::exa;
> +  using std::femto;
> +  using std::giga;
> +  using std::hecto;
> +  using std::kilo;
> +  using std::mega;
> +  using std::micro;
> +  using std::milli;
> +  using std::nano;
> +  using std::peta;
> +  using std::pico;
> +  using std::ratio;
> +  using std::ratio_add;
> +  using std::ratio_divide;
> +  using std::ratio_equal;
> +  using std::ratio_equal_v;
> +  using std::ratio_greater;
> +  using std::ratio_greater_equal;
> +  using std::ratio_greater_equal_v;
> +  using std::ratio_greater_v;
> +  using std::ratio_less;
> +  using std::ratio_less_equal;
> +  using std::ratio_less_equal_v;
> +  using std::ratio_less_v;
> +  using std::ratio_multiply;
> +  using std::ratio_not_equal;
> +  using std::ratio_not_equal_v;
> +  using std::ratio_subtract;
> +  using std::tera;
> +}
> +
> +// FIXME <rcu>
> +
> +// <regex>
> +export namespace std
> +{
> +  namespace regex_constants
> +  {
> +    using std::regex_constants::error_type;
> +    using std::regex_constants::match_flag_type;
> +    using std::regex_constants::syntax_option_type;
> +    using std::regex_constants::operator&;
> +    using std::regex_constants::operator&=;
> +    using std::regex_constants::operator^;
> +    using std::regex_constants::operator^=;
> +    using std::regex_constants::operator|;
> +    using std::regex_constants::operator|=;
> +    using std::regex_constants::operator~;
> +  }
> +  using std::basic_regex;
> +  using std::csub_match;
> +  using std::regex;
> +  using std::regex_error;
> +  using std::regex_traits;
> +  using std::ssub_match;
> +  using std::sub_match;
> +  using std::swap;
> +  using std::wcsub_match;
> +  using std::wregex;
> +  using std::wssub_match;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::cmatch;
> +  using std::cregex_iterator;
> +  using std::cregex_token_iterator;
> +  using std::match_results;
> +  using std::regex_iterator;
> +  using std::regex_match;
> +  using std::regex_replace;
> +  using std::regex_search;
> +  using std::regex_token_iterator;
> +  using std::smatch;
> +  using std::sregex_iterator;
> +  using std::sregex_token_iterator;
> +  using std::wcmatch;
> +  using std::wcregex_iterator;
> +  using std::wcregex_token_iterator;
> +  using std::wsmatch;
> +  using std::wsregex_iterator;
> +  using std::wsregex_token_iterator;
> +  namespace pmr
> +  {
> +    using std::pmr::cmatch;
> +    using std::pmr::match_results;
> +    using std::pmr::smatch;
> +    using std::pmr::wcmatch;
> +    using std::pmr::wsmatch;
> +  }
> +}
> +
> +// 20.5 <scoped_allocator>
> +export namespace std
> +{
> +  using std::scoped_allocator_adaptor;
> +  using std::operator==;
> +}
> +
> +// <semaphore>
> +export namespace std
> +{
> +  using std::binary_semaphore;
> +  using std::counting_semaphore;
> +}
> +
> +// <set>
> +export namespace std
> +{
> +  using std::set;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase_if;
> +  using std::multiset;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::multiset;
> +    using std::pmr::set;
> +  }
> +}
> +
> +// <shared_mutex>
> +export namespace std
> +{
> +  using std::shared_lock;
> +  using std::shared_mutex;
> +  using std::shared_timed_mutex;
> +  using std::swap;
> +}
> +
> +// 17.8.1 <source_location>
> +export namespace std
> +{
> +  using std::source_location;
> +}
> +
> +// <span>
> +export namespace std
> +{
> +  using std::dynamic_extent;
> +  using std::span;
> +  namespace ranges
> +  {
> +    using std::ranges::enable_borrowed_range;
> +    using std::ranges::enable_view;
> +  }
> +  using std::as_bytes;
> +  using std::as_writable_bytes;
> +}
> +
> +// <sstream>
> +export namespace std
> +{
> +  using std::basic_istringstream;
> +  using std::basic_ostringstream;
> +  using std::basic_stringbuf;
> +  using std::basic_stringstream;
> +  using std::istringstream;
> +  using std::ostringstream;
> +  using std::stringbuf;
> +  using std::stringstream;
> +  using std::swap;
> +  using std::wistringstream;
> +  using std::wostringstream;
> +  using std::wstringbuf;
> +  using std::wstringstream;
> +}
> +
> +// <stack>
> +export namespace std
> +{
> +  using std::stack;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::swap;
> +  using std::uses_allocator;
> +}
> +
> +// 19.6 <stacktrace>
> +export namespace std
> +{
> +  using std::stacktrace_entry;
> +  using std::basic_stacktrace;
> +  using std::stacktrace;
> +  using std::swap;
> +  using std::to_string;
> +  using std::operator<<;
> +  using std::formatter;
> +  namespace pmr
> +  {
> +    using std::pmr::stacktrace;
> +  }
> +  using std::hash;
> +}
> +
> +// 19.2 <stdexcept>
> +export namespace std
> +{
> +  using std::domain_error;
> +  using std::invalid_argument;
> +  using std::length_error;
> +  using std::logic_error;
> +  using std::out_of_range;
> +  using std::overflow_error;
> +  using std::range_error;
> +  using std::runtime_error;
> +  using std::underflow_error;
> +}
> +
> +// 17.4.2 <stdfloat>
> +export namespace std
> +{
> +#ifdef __STDCPP_FLOAT16_T__
> +  using std::float16_t;
> +#endif
> +#ifdef __STDCPP_FLOAT32_T__
> +  using std::float32_t;
> +#endif
> +#ifdef __STDCPP_FLOAT64_T__
> +  using std::float64_t;
> +#endif
> +#ifdef __STDCPP_FLOAT128_T__
> +  using std::float128_t;
> +#endif
> +#ifdef __STDCPP_BFLOAT16_T__
> +  using std::bfloat16_t;
> +#endif
> +}
> +
> +// FIXME <stop_token>
> +
> +// <streambuf>
> +export namespace std
> +{
> +  using std::basic_streambuf;
> +  using std::streambuf;
> +  using std::wstreambuf;
> +}
> +
> +// <string>
> +export namespace std
> +{
> +  using std::basic_string;
> +  using std::char_traits;
> +  using std::operator+;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::swap;
> +  using std::operator>>;
> +  using std::operator<<;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::getline;
> +  using std::stod;
> +  using std::stof;
> +  using std::stoi;
> +  using std::stol;
> +  using std::stold;
> +  using std::stoll;
> +  using std::stoul;
> +  using std::stoull;
> +  using std::string;
> +  using std::to_string;
> +  using std::to_wstring;
> +  using std::u16string;
> +  using std::u32string;
> +  using std::u8string;
> +  using std::wstring;
> +  namespace pmr
> +  {
> +    using std::pmr::basic_string;
> +    using std::pmr::string;
> +    using std::pmr::u16string;
> +    using std::pmr::u32string;
> +    using std::pmr::u8string;
> +    using std::pmr::wstring;
> +  }
> +  using std::hash;
> +  using std::operator""s;
> +}
> +
> +// <string_view>
> +export namespace std
> +{
> +  using std::basic_string_view;
> +  namespace ranges
> +  {
> +    using std::ranges::enable_borrowed_range;
> +    using std::ranges::enable_view;
> +  }
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::hash;
> +  using std::string_view;
> +  using std::u16string_view;
> +  using std::u32string_view;
> +  using std::u8string_view;
> +  using std::wstring_view;
> +  using std::operator""sv;
> +}
> +
> +// <strstream>: deprecated C++98, removed C++26
> +export namespace std
> +{
> +  using std::istrstream;
> +  using std::ostrstream;
> +  using std::strstream;
> +  using std::strstreambuf;
> +}
> +
> +// <syncstream>
> +export namespace std
> +{
> +  using std::basic_syncbuf;
> +  using std::swap;
> +  using std::basic_osyncstream;
> +  using std::osyncstream;
> +  using std::syncbuf;
> +  using std::wosyncstream;
> +  using std::wsyncbuf;
> +}
> +
> +// 19.5 <system_error>
> +export namespace std
> +{
> +  using std::errc;
> +  using std::error_category;
> +  using std::error_code;
> +  using std::error_condition;
> +  using std::generic_category;
> +  using std::is_error_code_enum;
> +  using std::is_error_condition_enum;
> +  using std::make_error_code;
> +  using std::system_category;
> +  using std::system_error;
> +  using std::operator<<;
> +  using std::make_error_condition;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::hash;
> +  using std::is_error_code_enum_v;
> +  using std::is_error_condition_enum_v;
> +}
> +
> +// FIXME <text_encoding>
> +
> +// <thread>
> +export namespace std
> +{
> +  using std::swap;
> +  using std::thread;
> +  using std::jthread;
> +  namespace this_thread
> +  {
> +    using std::this_thread::get_id;
> +    using std::this_thread::sleep_for;
> +    using std::this_thread::sleep_until;
> +    using std::this_thread::yield;
> +  }
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::hash;
> +}
> +
> +// <tuple>
> +export namespace std
> +{
> +  using std::apply;
> +  using std::forward_as_tuple;
> +  using std::get;
> +  using std::ignore;
> +  using std::make_from_tuple;
> +  using std::make_tuple;
> +  using std::tie;
> +  using std::tuple;
> +  using std::tuple_cat;
> +  using std::tuple_element;
> +  using std::tuple_element_t;
> +  using std::tuple_size;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::swap;
> +  using std::tuple_size_v;
> +  using std::uses_allocator;
> +}
> +
> +// <type_traits>
> +export namespace std
> +{
> +  using std::add_const;
> +  using std::add_const_t;
> +  using std::add_cv;
> +  using std::add_cv_t;
> +  using std::add_lvalue_reference;
> +  using std::add_lvalue_reference_t;
> +  using std::add_pointer;
> +  using std::add_pointer_t;
> +  using std::add_rvalue_reference;
> +  using std::add_rvalue_reference_t;
> +  using std::add_volatile;
> +  using std::add_volatile_t;
> +  using std::aligned_storage;
> +  using std::aligned_storage_t;
> +  using std::aligned_union;
> +  using std::aligned_union_t;
> +  using std::alignment_of;
> +  using std::alignment_of_v;
> +  using std::basic_common_reference;
> +  using std::bool_constant;
> +  using std::common_reference;
> +  using std::common_reference_t;
> +  using std::common_type;
> +  using std::common_type_t;
> +  using std::conditional;
> +  using std::conditional_t;
> +  using std::conjunction;
> +  using std::conjunction_v;
> +  using std::decay;
> +  using std::decay_t;
> +  using std::disjunction;
> +  using std::disjunction_v;
> +  using std::enable_if;
> +  using std::enable_if_t;
> +  using std::extent;
> +  using std::extent_v;
> +  using std::false_type;
> +  using std::has_unique_object_representations;
> +  using std::has_unique_object_representations_v;
> +  using std::has_virtual_destructor;
> +  using std::has_virtual_destructor_v;
> +  using std::integral_constant;
> +  using std::invoke_result;
> +  using std::invoke_result_t;
> +  using std::is_abstract;
> +  using std::is_abstract_v;
> +  using std::is_aggregate;
> +  using std::is_aggregate_v;
> +  using std::is_arithmetic;
> +  using std::is_arithmetic_v;
> +  using std::is_array;
> +  using std::is_array_v;
> +  using std::is_assignable;
> +  using std::is_assignable_v;
> +  using std::is_base_of;
> +  using std::is_base_of_v;
> +  using std::is_bounded_array;
> +  using std::is_bounded_array_v;
> +  using std::is_class;
> +  using std::is_class_v;
> +  using std::is_compound;
> +  using std::is_compound_v;
> +  using std::is_const;
> +  using std::is_const_v;
> +  using std::is_constant_evaluated;
> +  using std::is_constructible;
> +  using std::is_constructible_v;
> +  using std::is_convertible;
> +  using std::is_convertible_v;
> +  using std::is_copy_assignable;
> +  using std::is_copy_assignable_v;
> +  using std::is_copy_constructible;
> +  using std::is_copy_constructible_v;
> +  using std::is_default_constructible;
> +  using std::is_default_constructible_v;
> +  using std::is_destructible;
> +  using std::is_destructible_v;
> +  using std::is_empty;
> +  using std::is_empty_v;
> +  using std::is_enum;
> +  using std::is_enum_v;
> +  using std::is_final;
> +  using std::is_final_v;
> +  using std::is_floating_point;
> +  using std::is_floating_point_v;
> +  using std::is_function;
> +  using std::is_function_v;
> +  using std::is_fundamental;
> +  using std::is_fundamental_v;
> +  using std::is_integral;
> +  using std::is_integral_v;
> +  using std::is_invocable;
> +  using std::is_invocable_r;
> +  using std::is_invocable_r_v;
> +  using std::is_invocable_v;
> +  using std::is_lvalue_reference;
> +  using std::is_lvalue_reference_v;
> +  using std::is_member_function_pointer;
> +  using std::is_member_function_pointer_v;
> +  using std::is_member_object_pointer;
> +  using std::is_member_object_pointer_v;
> +  using std::is_member_pointer;
> +  using std::is_member_pointer_v;
> +  using std::is_move_assignable;
> +  using std::is_move_assignable_v;
> +  using std::is_move_constructible;
> +  using std::is_move_constructible_v;
> +  using std::is_nothrow_assignable;
> +  using std::is_nothrow_assignable_v;
> +  using std::is_nothrow_constructible;
> +  using std::is_nothrow_constructible_v;
> +  using std::is_nothrow_convertible;
> +  using std::is_nothrow_convertible_v;
> +  using std::is_nothrow_copy_assignable;
> +  using std::is_nothrow_copy_assignable_v;
> +  using std::is_nothrow_copy_constructible;
> +  using std::is_nothrow_copy_constructible_v;
> +  using std::is_nothrow_default_constructible;
> +  using std::is_nothrow_default_constructible_v;
> +  using std::is_nothrow_destructible;
> +  using std::is_nothrow_destructible_v;
> +  using std::is_nothrow_invocable;
> +  using std::is_nothrow_invocable_r;
> +  using std::is_nothrow_invocable_r_v;
> +  using std::is_nothrow_invocable_v;
> +  using std::is_nothrow_move_assignable;
> +  using std::is_nothrow_move_assignable_v;
> +  using std::is_nothrow_move_constructible;
> +  using std::is_nothrow_move_constructible_v;
> +  using std::is_nothrow_swappable;
> +  using std::is_nothrow_swappable_v;
> +  using std::is_nothrow_swappable_with;
> +  using std::is_nothrow_swappable_with_v;
> +  using std::is_null_pointer;
> +  using std::is_null_pointer_v;
> +  using std::is_object;
> +  using std::is_object_v;
> +  using std::is_pod;
> +  using std::is_pod_v;
> +  using std::is_pointer;
> +  using std::is_pointer_v;
> +  using std::is_polymorphic;
> +  using std::is_polymorphic_v;
> +  using std::is_reference;
> +  using std::is_reference_v;
> +  using std::is_rvalue_reference;
> +  using std::is_rvalue_reference_v;
> +  using std::is_same;
> +  using std::is_same_v;
> +  using std::is_scalar;
> +  using std::is_scalar_v;
> +  using std::is_signed;
> +  using std::is_signed_v;
> +  using std::is_standard_layout;
> +  using std::is_standard_layout_v;
> +  using std::is_swappable;
> +  using std::is_swappable_v;
> +  using std::is_swappable_with;
> +  using std::is_swappable_with_v;
> +  using std::is_trivial;
> +  using std::is_trivial_v;
> +  using std::is_trivially_assignable;
> +  using std::is_trivially_assignable_v;
> +  using std::is_trivially_constructible;
> +  using std::is_trivially_constructible_v;
> +  using std::is_trivially_copy_assignable;
> +  using std::is_trivially_copy_assignable_v;
> +  using std::is_trivially_copy_constructible;
> +  using std::is_trivially_copy_constructible_v;
> +  using std::is_trivially_copyable;
> +  using std::is_trivially_copyable_v;
> +  using std::is_trivially_default_constructible;
> +  using std::is_trivially_default_constructible_v;
> +  using std::is_trivially_destructible;
> +  using std::is_trivially_destructible_v;
> +  using std::is_trivially_move_assignable;
> +  using std::is_trivially_move_assignable_v;
> +  using std::is_trivially_move_constructible;
> +  using std::is_trivially_move_constructible_v;
> +  using std::is_unbounded_array;
> +  using std::is_unbounded_array_v;
> +  using std::is_union;
> +  using std::is_union_v;
> +  using std::is_unsigned;
> +  using std::is_unsigned_v;
> +  using std::is_void;
> +  using std::is_void_v;
> +  using std::is_volatile;
> +  using std::is_volatile_v;
> +  using std::make_signed;
> +  using std::make_signed_t;
> +  using std::make_unsigned;
> +  using std::make_unsigned_t;
> +  using std::negation;
> +  using std::negation_v;
> +  using std::rank;
> +  using std::rank_v;
> +  using std::remove_all_extents;
> +  using std::remove_all_extents_t;
> +  using std::remove_const;
> +  using std::remove_const_t;
> +  using std::remove_cv;
> +  using std::remove_cv_t;
> +  using std::remove_cvref;
> +  using std::remove_cvref_t;
> +  using std::remove_extent;
> +  using std::remove_extent_t;
> +  using std::remove_pointer;
> +  using std::remove_pointer_t;
> +  using std::remove_reference;
> +  using std::remove_reference_t;
> +  using std::remove_volatile;
> +  using std::remove_volatile_t;
> +  using std::true_type;
> +  using std::type_identity;
> +  using std::type_identity_t;
> +  using std::underlying_type;
> +  using std::underlying_type_t;
> +  using std::unwrap_ref_decay;
> +  using std::unwrap_ref_decay_t;
> +  using std::unwrap_reference;
> +  using std::unwrap_reference_t;
> +  using std::void_t;
> +}
> +
> +// <typeindex>
> +export namespace std
> +{
> +  using std::hash;
> +  using std::type_index;
> +}
> +
> +// 17.7.2 <typeinfo> [typeinfo.syn]
> +export namespace std
> +{
> +  using std::bad_cast;
> +  using std::bad_typeid;
> +  using std::type_info;
> +}
> +
> +// <unordered_map>
> +export namespace std
> +{
> +  using std::unordered_map;
> +  using std::unordered_multimap;
> +  using std::operator==;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::unordered_map;
> +    using std::pmr::unordered_multimap;
> +  }
> +}
> +
> +// <unordered_set>
> +export namespace std
> +{
> +  using std::unordered_multiset;
> +  using std::unordered_set;
> +  using std::operator==;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::unordered_multiset;
> +    using std::pmr::unordered_set;
> +  }
> +}
> +
> +// <utility>
> +export namespace std
> +{
> +  using std::as_const;
> +  using std::cmp_equal;
> +  using std::cmp_greater;
> +  using std::cmp_greater_equal;
> +  using std::cmp_less;
> +  using std::cmp_less_equal;
> +  using std::cmp_not_equal;
> +  using std::declval;
> +  using std::exchange;
> +  using std::forward;
> +  using std::in_range;
> +  using std::index_sequence;
> +  using std::index_sequence_for;
> +  using std::integer_sequence;
> +  using std::make_index_sequence;
> +  using std::make_integer_sequence;
> +  using std::move;
> +  using std::move_if_noexcept;
> +  using std::pair;
> +  using std::swap;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::get;
> +  using std::in_place;
> +  using std::in_place_index;
> +  using std::in_place_index_t;
> +  using std::in_place_t;
> +  using std::in_place_type;
> +  using std::in_place_type_t;
> +  using std::make_pair;
> +  using std::piecewise_construct;
> +  using std::piecewise_construct_t;
> +  using std::tuple_element;
> +  using std::tuple_size;
> +  namespace rel_ops
> +  {
> +    using std::rel_ops::operator!=;
> +    using std::rel_ops::operator>;
> +    using std::rel_ops::operator<=;
> +    using std::rel_ops::operator>=;
> +  }
> +}
> +
> +// <valarray>
> +export namespace std
> +{
> +  using std::gslice;
> +  using std::gslice_array;
> +  using std::indirect_array;
> +  using std::mask_array;
> +  using std::slice;
> +  using std::slice_array;
> +  using std::swap;
> +  using std::valarray;
> +  using std::operator*;
> +  using std::operator/;
> +  using std::operator%;
> +  using std::operator+;
> +  using std::operator-;
> +  using std::operator^;
> +  using std::operator&;
> +  using std::operator|;
> +  using std::operator<<;
> +  using std::operator>>;
> +  using std::operator&&;
> +  using std::operator||;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::abs;
> +  using std::acos;
> +  using std::asin;
> +  using std::atan;
> +  using std::atan2;
> +  using std::begin;
> +  using std::cos;
> +  using std::cosh;
> +  using std::end;
> +  using std::exp;
> +  using std::log;
> +  using std::log10;
> +  using std::pow;
> +  using std::sin;
> +  using std::sinh;
> +  using std::sqrt;
> +  using std::tan;
> +  using std::tanh;
> +}
> +
> +// <variant>
> +export namespace std
> +{
> +  using std::get;
> +  using std::get_if;
> +  using std::holds_alternative;
> +  using std::variant;
> +  using std::variant_alternative;
> +  using std::variant_alternative_t;
> +  using std::variant_npos;
> +  using std::variant_size;
> +  using std::variant_size_v;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::bad_variant_access;
> +  using std::hash;
> +  using std::monostate;
> +  using std::swap;
> +  using std::visit;
> +}
> +
> +// <vector>
> +export namespace std
> +{
> +  using std::vector;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::vector;
> +  }
> +  using std::hash;
> +}
> diff --git a/libstdc++-v3/src/c++23/modules/std.compat.cc b/libstdc++-v3/src/c++23/modules/std.compat.cc
> new file mode 100644
> index 00000000000..7d90f20378a
> --- /dev/null
> +++ b/libstdc++-v3/src/c++23/modules/std.compat.cc
> @@ -0,0 +1,640 @@
> +// -*- C++ -*- [std.modules] module std.compat
> +
> +// Copyright The GNU Toolchain Authors.
> +//
> +// This file is part of the GNU ISO C++ Library.  This library 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.
> +
> +// This library 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.
> +
> +// Under Section 7 of GPL version 3, you are granted additional
> +// permissions described in the GCC Runtime Library Exception, version
> +// 3.1, as published by the Free Software Foundation.
> +
> +// You should have received a copy of the GNU General Public License and
> +// a copy of the GCC Runtime Library Exception along with this program;
> +// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +// <http://www.gnu.org/licenses/>.
> +
> +export module std.compat;
> +export import std;
> +
> +#define STD_COMPAT
> +
> +// **** The below is copied verbatim from std.cc, starting with "C standard
> +// **** library headers" and ending with "End of C library".  Make any edits
> +// **** there and update the copy.
> +
> +// C standard library headers [tab:headers.cpp.c]
> +
> +#ifndef STD_COMPAT
> +#define C_LIB_NAMESPACE namespace std
> +#endif
> +
> +// 19.3 <cassert>
> +// No exports
> +
> +// 23.5.1 <cctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::isalnum;
> +  using std::isalpha;
> +  using std::isblank;
> +  using std::iscntrl;
> +  using std::isdigit;
> +  using std::isgraph;
> +  using std::islower;
> +  using std::isprint;
> +  using std::ispunct;
> +  using std::isspace;
> +  using std::isupper;
> +  using std::isxdigit;
> +  using std::tolower;
> +  using std::toupper;
> +}
> +
> +// 19.4 <cerrno>
> +// No exports
> +
> +// 28.3 <cfenv>
> +export C_LIB_NAMESPACE
> +{
> +  using std::feclearexcept;
> +  using std::fegetenv;
> +  using std::fegetexceptflag;
> +  using std::fegetround;
> +  using std::feholdexcept;
> +  using std::fenv_t;
> +  using std::feraiseexcept;
> +  using std::fesetenv;
> +  using std::fesetexceptflag;
> +  using std::fesetround;
> +  using std::fetestexcept;
> +  using std::feupdateenv;
> +  using std::fexcept_t;
> +}
> +
> +// 17.3.7 <cfloat> [cfloat.syn]
> +// No exports, only provides macros
> +
> +// 31.13.2 <cinttypes>
> +export C_LIB_NAMESPACE
> +{
> +  using std::imaxabs;
> +  using std::imaxdiv;
> +  using std::imaxdiv_t;
> +  using std::strtoimax;
> +  using std::strtoumax;
> +  using std::wcstoimax;
> +  using std::wcstoumax;
> +}
> +
> +// 17.3.6 <climits> [climits.syn]
> +// No exports, only provides macros
> +
> +// 30.5 <clocale>
> +export C_LIB_NAMESPACE
> +{
> +  using std::lconv;
> +  using std::localeconv;
> +  using std::setlocale;
> +  // LC_* macros not exported
> +}
> +
> +// 28.7.1 <cmath>
> +// FIXME missing special functions
> +export C_LIB_NAMESPACE
> +{
> +  using std::abs;
> +  using std::acos;
> +  using std::acosf;
> +  using std::acosh;
> +  using std::acoshf;
> +  using std::acoshl;
> +  using std::acosl;
> +  using std::asin;
> +  using std::asinf;
> +  using std::asinh;
> +  using std::asinhf;
> +  using std::asinhl;
> +  using std::asinl;
> +  using std::atan;
> +  using std::atan2;
> +  using std::atan2f;
> +  using std::atan2l;
> +  using std::atanf;
> +  using std::atanh;
> +  using std::atanhf;
> +  using std::atanhl;
> +  using std::atanl;
> +  using std::cbrt;
> +  using std::cbrtf;
> +  using std::cbrtl;
> +  using std::ceil;
> +  using std::ceilf;
> +  using std::ceill;
> +  using std::copysign;
> +  using std::copysignf;
> +  using std::copysignl;
> +  using std::cos;
> +  using std::cosf;
> +  using std::cosh;
> +  using std::coshf;
> +  using std::coshl;
> +  using std::cosl;
> +  using std::double_t;
> +  using std::erf;
> +  using std::erfc;
> +  using std::erfcf;
> +  using std::erfcl;
> +  using std::erff;
> +  using std::erfl;
> +  using std::exp;
> +  using std::exp2;
> +  using std::exp2f;
> +  using std::exp2l;
> +  using std::expf;
> +  using std::expl;
> +  using std::expm1;
> +  using std::expm1f;
> +  using std::expm1l;
> +  using std::fabs;
> +  using std::fabsf;
> +  using std::fabsl;
> +  using std::fdim;
> +  using std::fdimf;
> +  using std::fdiml;
> +  using std::float_t;
> +  using std::floor;
> +  using std::floorf;
> +  using std::floorl;
> +  using std::fma;
> +  using std::fmaf;
> +  using std::fmal;
> +  using std::fmax;
> +  using std::fmaxf;
> +  using std::fmaxl;
> +  using std::fmin;
> +  using std::fminf;
> +  using std::fminl;
> +  using std::fmod;
> +  using std::fmodf;
> +  using std::fmodl;
> +  using std::fpclassify;
> +  using std::frexp;
> +  using std::frexpf;
> +  using std::frexpl;
> +  using std::hypot;
> +  using std::hypotf;
> +  using std::hypotl;
> +  using std::ilogb;
> +  using std::ilogbf;
> +  using std::ilogbl;
> +  using std::isfinite;
> +  using std::isgreater;
> +  using std::isgreaterequal;
> +  using std::isinf;
> +  using std::isless;
> +  using std::islessequal;
> +  using std::islessgreater;
> +  using std::isnan;
> +  using std::isnormal;
> +  using std::isunordered;
> +  using std::ldexp;
> +  using std::ldexpf;
> +  using std::ldexpl;
> +#ifndef STD_COMPAT
> +  using std::lerp;
> +#endif
> +  using std::lgamma;
> +  using std::lgammaf;
> +  using std::lgammal;
> +  using std::llrint;
> +  using std::llrintf;
> +  using std::llrintl;
> +  using std::llround;
> +  using std::llroundf;
> +  using std::llroundl;
> +  using std::log;
> +  using std::log10;
> +  using std::log10f;
> +  using std::log10l;
> +  using std::log1p;
> +  using std::log1pf;
> +  using std::log1pl;
> +  using std::log2;
> +  using std::log2f;
> +  using std::log2l;
> +  using std::logb;
> +  using std::logbf;
> +  using std::logbl;
> +  using std::logf;
> +  using std::logl;
> +  using std::lrint;
> +  using std::lrintf;
> +  using std::lrintl;
> +  using std::lround;
> +  using std::lroundf;
> +  using std::lroundl;
> +  using std::modf;
> +  using std::modff;
> +  using std::modfl;
> +  using std::nan;
> +  using std::nanf;
> +  using std::nanl;
> +  using std::nearbyint;
> +  using std::nearbyintf;
> +  using std::nearbyintl;
> +  using std::nextafter;
> +  using std::nextafterf;
> +  using std::nextafterl;
> +  using std::nexttoward;
> +  using std::nexttowardf;
> +  using std::nexttowardl;
> +  using std::pow;
> +  using std::powf;
> +  using std::powl;
> +  using std::remainder;
> +  using std::remainderf;
> +  using std::remainderl;
> +  using std::remquo;
> +  using std::remquof;
> +  using std::remquol;
> +  using std::rint;
> +  using std::rintf;
> +  using std::rintl;
> +  using std::round;
> +  using std::roundf;
> +  using std::roundl;
> +  using std::scalbln;
> +  using std::scalblnf;
> +  using std::scalblnl;
> +  using std::scalbn;
> +  using std::scalbnf;
> +  using std::scalbnl;
> +  using std::signbit;
> +  using std::sin;
> +  using std::sinf;
> +  using std::sinh;
> +  using std::sinhf;
> +  using std::sinhl;
> +  using std::sinl;
> +  using std::sqrt;
> +  using std::sqrtf;
> +  using std::sqrtl;
> +  using std::tan;
> +  using std::tanf;
> +  using std::tanh;
> +  using std::tanhf;
> +  using std::tanhl;
> +  using std::tanl;
> +  using std::tgamma;
> +  using std::tgammaf;
> +  using std::tgammal;
> +  using std::trunc;
> +  using std::truncf;
> +  using std::truncl;
> +}
> +
> +// 17.13.3 <csetjmp>
> +export C_LIB_NAMESPACE
> +{
> +  using std::jmp_buf;
> +  using std::longjmp;
> +  // setjmp macro not exported
> +}
> +
> +// 17.13.4 <csignal>
> +export C_LIB_NAMESPACE
> +{
> +  using std::raise;
> +  using std::sig_atomic_t;
> +  using std::signal;
> +  // SIG_* macros not exported
> +}
> +
> +// 17.13.2 <cstdarg>
> +export C_LIB_NAMESPACE
> +{
> +  using std::va_list;
> +  // va_arg and friend macros not exported
> +}
> +
> +// 17.2.1 <cstddef> [cstddef.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::max_align_t;
> +  using std::nullptr_t;
> +  using std::ptrdiff_t;
> +  using std::size_t;
> +#ifndef STD_COMPAT
> +  using std::byte;
> +  using std::operator<<=;
> +  using std::operator<<;
> +  using std::operator>>=;
> +  using std::operator>>;
> +  using std::operator|=;
> +  using std::operator|;
> +  using std::operator&=;
> +  using std::operator&;
> +  using std::operator^=;
> +  using std::operator^;
> +  using std::operator~;
> +  using std::to_integer;
> +#endif
> +  // NULL and offsetof macros not exported
> +}
> +
> +// 17.4 <cstdint>
> +export C_LIB_NAMESPACE
> +{
> +  using std::int8_t;
> +  using std::int16_t;
> +  using std::int32_t;
> +  using std::int64_t;
> +  using std::int_fast16_t;
> +  using std::int_fast32_t;
> +  using std::int_fast64_t;
> +  using std::int_fast8_t;
> +  using std::int_least16_t;
> +  using std::int_least32_t;
> +  using std::int_least64_t;
> +  using std::int_least8_t;
> +  using std::intmax_t;
> +  using std::intptr_t;
> +  using std::uint8_t;
> +  using std::uint16_t;
> +  using std::uint32_t;
> +  using std::uint64_t;
> +  using std::uint_fast16_t;
> +  using std::uint_fast32_t;
> +  using std::uint_fast64_t;
> +  using std::uint_fast8_t;
> +  using std::uint_least16_t;
> +  using std::uint_least32_t;
> +  using std::uint_least64_t;
> +  using std::uint_least8_t;
> +  using std::uintmax_t;
> +  using std::uintptr_t;
> +}
> +
> +// 31.13.1 <cstdio>
> +export C_LIB_NAMESPACE
> +{
> +  using std::clearerr;
> +  using std::fclose;
> +  using std::feof;
> +  using std::ferror;
> +  using std::fflush;
> +  using std::fgetc;
> +  using std::fgetpos;
> +  using std::fgets;
> +  using std::FILE;
> +  using std::fopen;
> +  using std::fpos_t;
> +  using std::fprintf;
> +  using std::fputc;
> +  using std::fputs;
> +  using std::fread;
> +  using std::freopen;
> +  using std::fscanf;
> +  using std::fseek;
> +  using std::fsetpos;
> +  using std::ftell;
> +  using std::fwrite;
> +  using std::getc;
> +  using std::getchar;
> +  using std::perror;
> +  using std::printf;
> +  using std::putc;
> +  using std::putchar;
> +  using std::puts;
> +  using std::remove;
> +  using std::rename;
> +  using std::rewind;
> +  using std::scanf;
> +  using std::setbuf;
> +  using std::setvbuf;
> +  using std::size_t;
> +  using std::snprintf;
> +  using std::sprintf;
> +  using std::sscanf;
> +  using std::tmpfile;
> +  using std::tmpnam;
> +  using std::ungetc;
> +  using std::vfprintf;
> +  using std::vfscanf;
> +  using std::vprintf;
> +  using std::vscanf;
> +  using std::vsnprintf;
> +  using std::vsprintf;
> +  using std::vsscanf;
> +}
> +
> +// 17.2.2 <cstdlib> [cstdlib.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::_Exit;
> +  using std::abort;
> +  using std::abs;
> +  using std::aligned_alloc;
> +  using std::at_quick_exit;
> +  using std::atexit;
> +  using std::atof;
> +  using std::atoi;
> +  using std::atol;
> +  using std::atoll;
> +  using std::bsearch;
> +  using std::calloc;
> +  using std::div;
> +  using std::div_t;
> +  using std::exit;
> +  using std::free;
> +  using std::getenv;
> +  using std::labs;
> +  using std::ldiv;
> +  using std::ldiv_t;
> +  using std::llabs;
> +  using std::lldiv;
> +  using std::lldiv_t;
> +  using std::malloc;
> +  using std::mblen;
> +  using std::mbstowcs;
> +  using std::mbtowc;
> +  using std::qsort;
> +  using std::quick_exit;
> +  using std::rand;
> +  using std::realloc;
> +  using std::size_t;
> +  using std::srand;
> +  using std::strtod;
> +  using std::strtof;
> +  using std::strtol;
> +  using std::strtold;
> +  using std::strtoll;
> +  using std::strtoul;
> +  using std::strtoull;
> +  using std::system;
> +  using std::wcstombs;
> +  using std::wctomb;
> +}
> +
> +// 23.5.3 <cstring>
> +export C_LIB_NAMESPACE
> +{
> +  using std::memchr;
> +  using std::memcmp;
> +  using std::memcpy;
> +  using std::memmove;
> +  using std::memset;
> +  using std::size_t;
> +  using std::strcat;
> +  using std::strchr;
> +  using std::strcmp;
> +  using std::strcoll;
> +  using std::strcpy;
> +  using std::strcspn;
> +  using std::strerror;
> +  using std::strlen;
> +  using std::strncat;
> +  using std::strncmp;
> +  using std::strncpy;
> +  using std::strpbrk;
> +  using std::strrchr;
> +  using std::strspn;
> +  using std::strstr;
> +  using std::strtok;
> +  using std::strxfrm;
> +}
> +
> +// 29.15 <ctime>
> +export C_LIB_NAMESPACE
> +{
> +  using std::asctime;
> +  using std::clock;
> +  using std::clock_t;
> +  using std::ctime;
> +  using std::difftime;
> +  using std::gmtime;
> +  using std::localtime;
> +  using std::mktime;
> +  using std::size_t;
> +  using std::strftime;
> +  using std::time;
> +  using std::time_t;
> +  using std::timespec;
> +  using std::tm;
> +  using std::timespec_get;
> +}
> +
> +// 23.5.5 <cuchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::mbrtoc8;
> +  using std::c8rtomb;
> +  using std::mbrtoc16;
> +  using std::c16rtomb;
> +  using std::mbrtoc32;
> +  using std::c32rtomb;
> +}
> +
> +// 23.5.4 <cwchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::btowc;
> +  using std::fgetwc;
> +  using std::fgetws;
> +  using std::fputwc;
> +  using std::fputws;
> +  using std::fwide;
> +  using std::fwprintf;
> +  using std::fwscanf;
> +  using std::getwc;
> +  using std::getwchar;
> +  using std::mbrlen;
> +  using std::mbrtowc;
> +  using std::mbsinit;
> +  using std::mbsrtowcs;
> +  using std::mbstate_t;
> +  using std::putwc;
> +  using std::putwchar;
> +  using std::size_t;
> +  using std::swprintf;
> +  using std::swscanf;
> +  using std::tm;
> +  using std::ungetwc;
> +  using std::vfwprintf;
> +  using std::vfwscanf;
> +  using std::vswprintf;
> +  using std::vswscanf;
> +  using std::vwprintf;
> +  using std::vwscanf;
> +  using std::wcrtomb;
> +  using std::wcscat;
> +  using std::wcschr;
> +  using std::wcscmp;
> +  using std::wcscoll;
> +  using std::wcscpy;
> +  using std::wcscspn;
> +  using std::wcsftime;
> +  using std::wcslen;
> +  using std::wcsncat;
> +  using std::wcsncmp;
> +  using std::wcsncpy;
> +  using std::wcspbrk;
> +  using std::wcsrchr;
> +  using std::wcsrtombs;
> +  using std::wcsspn;
> +  using std::wcsstr;
> +  using std::wcstod;
> +  using std::wcstof;
> +  using std::wcstok;
> +  using std::wcstol;
> +  using std::wcstold;
> +  using std::wcstoll;
> +  using std::wcstoul;
> +  using std::wcstoull;
> +  using std::wcsxfrm;
> +  using std::wctob;
> +  using std::wint_t;
> +  using std::wmemchr;
> +  using std::wmemcmp;
> +  using std::wmemcpy;
> +  using std::wmemmove;
> +  using std::wmemset;
> +  using std::wprintf;
> +  using std::wscanf;
> +}
> +
> +// 23.5.2 <cwctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::iswalnum;
> +  using std::iswalpha;
> +  using std::iswblank;
> +  using std::iswcntrl;
> +  using std::iswctype;
> +  using std::iswdigit;
> +  using std::iswgraph;
> +  using std::iswlower;
> +  using std::iswprint;
> +  using std::iswpunct;
> +  using std::iswspace;
> +  using std::iswupper;
> +  using std::iswxdigit;
> +  using std::towctrans;
> +  using std::towlower;
> +  using std::towupper;
> +  using std::wctrans;
> +  using std::wctrans_t;
> +  using std::wctype;
> +  using std::wctype_t;
> +  using std::wint_t;
> +}
> +
> +// **** End of C library ****
> diff --git a/contrib/relpath.sh b/contrib/relpath.sh
> new file mode 100755
> index 00000000000..51bde081636
> --- /dev/null
> +++ b/contrib/relpath.sh
> @@ -0,0 +1,70 @@
> +#!/bin/sh
> +
> +if [ "$1" == "--help" ]; then
> +    echo Usage: relpath.sh FROM TO
> +    echo Print the relative path from FROM to TO
> +    echo FROM must be a directory, but need not exist
> +fi
> +
> +if [ -f "$1" ]; then
> +    echo first argument must be a directory
> +    exit 1
> +fi
> +
> +from="${1%%/}"
> +to="${2%%/}"
> +
> +# Canonicalize directories if they contain '..'.
> +canonicalize() {
> +    path=$1
> +    suffix=
> +    while ! [ -d "$path" ]; do
> +	name=$(basename "$path")
> +	# Give up on a .. that doesn't exist.
> +	if [ $"name" = ".." ]; then break; fi
> +	path=$(dirname "$path")
> +	suffix="/$name$suffix"
> +    done
> +    if [ -d "$path" ]; then
> +	echo $(cd "$path"; pwd)$suffix
> +    else
> +	echo $1
> +    fi
> +}
> +
> +case "$to$from" in
> +    *..* )
> +	from=$(canonicalize "$from")
> +	to=$(canonicalize "$to")
> +	;;
> +esac
> +case "$to$from" in
> +    *..* )
> +	echo unable to canonicalize ..
> +	exit 1
> +	;;
> +esac
> +
> +back=
> +while [ "${to#$from}" = "$to" ]; do
> +    #echo $from too long
> +    from=$(dirname $from);
> +    back=../$back
> +
> +    if [ "$from" = "/" ]; then
> +	echo $to
> +	exit 0
> +    fi
> +done
> +
> +to=${to#$from}
> +to=${to##/}
> +back=${back%%/}
> +
> +if [ -n "$to" ] && [ -n "$back" ]; then
> +    echo $back/$to
> +elif [ -n "$back$to" ]; then
> +    echo $back$to
> +else
> +    echo .
> +fi
> diff --git a/libstdc++-v3/src/c++23/Makefile.am b/libstdc++-v3/src/c++23/Makefile.am
> index 74996d1e147..f8149e77102 100644
> --- a/libstdc++-v3/src/c++23/Makefile.am
> +++ b/libstdc++-v3/src/c++23/Makefile.am
> @@ -25,6 +25,24 @@ include $(top_srcdir)/fragment.am
>  # Convenience library for C++23 runtime.
>  noinst_LTLIBRARIES = libc++23convenience.la
>  
> +# module std support.  Not compiled for now, only installed.
> +toolexeclib_DATA = libstdc++.modules.json
> +nobase_pkgdata_DATA = modules/std.cc modules/std.compat.cc
> +
> +# The manifest to be installed uses the relative path between install dirs.
> +libstdc++.modules.json: libstdc++.modules.json.in
> +	relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \
> +		$(toolexeclibdir) $(pkgdatadir)) && \
> +	sed "s,@MODPATH@,$$relpath," $< > $@
> +
> +# The uninstalled manifest uses the absolute path to srcdir.
> +stamp-modules: libstdc++.modules.json.in
> +	sed 's,@MODPATH@,$(srcdir),' $< \
> +	  > ../.libs/libstdc++.modules.json
> +	@touch stamp-modules
> +
> +all-local: stamp-modules
> +
>  headers =
>  
>  if ENABLE_EXTERN_TEMPLATE
> diff --git a/libstdc++-v3/src/c++23/Makefile.in b/libstdc++-v3/src/c++23/Makefile.in
> index ce609688025..f57232b5035 100644
> --- a/libstdc++-v3/src/c++23/Makefile.in
> +++ b/libstdc++-v3/src/c++23/Makefile.in
> @@ -14,6 +14,7 @@
>  
>  @SET_MAKE@
>  
> +
>  VPATH = @srcdir@
>  am__is_gnu_make = { \
>    if test -z '$(MAKELEVEL)'; then \
> @@ -162,6 +163,36 @@ am__can_run_installinfo = \
>      n|no|NO) false;; \
>      *) (install-info --version) >/dev/null 2>&1;; \
>    esac
> +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
> +am__vpath_adj = case $$p in \
> +    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
> +    *) f=$$p;; \
> +  esac;
> +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
> +am__install_max = 40
> +am__nobase_strip_setup = \
> +  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
> +am__nobase_strip = \
> +  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
> +am__nobase_list = $(am__nobase_strip_setup); \
> +  for p in $$list; do echo "$$p $$p"; done | \
> +  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
> +  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
> +    if (++n[$$2] == $(am__install_max)) \
> +      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
> +    END { for (dir in files) print dir, files[dir] }'
> +am__base_list = \
> +  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
> +  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
> +am__uninstall_files_from_dir = { \
> +  test -z "$$files" \
> +    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
> +    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
> +         $(am__cd) "$$dir" && rm -f $$files; }; \
> +  }
> +am__installdirs = "$(DESTDIR)$(pkgdatadir)" \
> +	"$(DESTDIR)$(toolexeclibdir)"
> +DATA = $(nobase_pkgdata_DATA) $(toolexeclib_DATA)
>  am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
>  # Read a list of newline-separated strings from the standard input,
>  # and print each of them once, without duplicates.  Input order is
> @@ -424,6 +455,10 @@ AM_CPPFLAGS = $(GLIBCXX_INCLUDES) $(CPPFLAGS)
>  
>  # Convenience library for C++23 runtime.
>  noinst_LTLIBRARIES = libc++23convenience.la
> +
> +# module std support.  Not compiled for now, only installed.
> +toolexeclib_DATA = libstdc++.modules.json
> +nobase_pkgdata_DATA = modules/std.cc modules/std.compat.cc
>  headers = 
>  # XTEMPLATE_FLAGS =
>  @ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources = 
> @@ -566,6 +601,51 @@ mostlyclean-libtool:
>  
>  clean-libtool:
>  	-rm -rf .libs _libs
> +install-nobase_pkgdataDATA: $(nobase_pkgdata_DATA)
> +	@$(NORMAL_INSTALL)
> +	@list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
> +	if test -n "$$list"; then \
> +	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
> +	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
> +	fi; \
> +	$(am__nobase_list) | while read dir files; do \
> +	  xfiles=; for file in $$files; do \
> +	    if test -f "$$file"; then xfiles="$$xfiles $$file"; \
> +	    else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
> +	  test -z "$$xfiles" || { \
> +	    test "x$$dir" = x. || { \
> +	      echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
> +	      $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \
> +	    echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
> +	    $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \
> +	done
> +
> +uninstall-nobase_pkgdataDATA:
> +	@$(NORMAL_UNINSTALL)
> +	@list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
> +	$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
> +	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
> +install-toolexeclibDATA: $(toolexeclib_DATA)
> +	@$(NORMAL_INSTALL)
> +	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
> +	if test -n "$$list"; then \
> +	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
> +	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
> +	fi; \
> +	for p in $$list; do \
> +	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
> +	  echo "$$d$$p"; \
> +	done | $(am__base_list) | \
> +	while read files; do \
> +	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibdir)'"; \
> +	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibdir)" || exit $$?; \
> +	done
> +
> +uninstall-toolexeclibDATA:
> +	@$(NORMAL_UNINSTALL)
> +	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
> +	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
> +	dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir)
>  
>  ID: $(am__tagged_files)
>  	$(am__define_uniq_tagged_files); mkid -fID $$unique
> @@ -620,8 +700,11 @@ distclean-tags:
>  	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
>  check-am: all-am
>  check: check-am
> -all-am: Makefile $(LTLIBRARIES)
> +all-am: Makefile $(LTLIBRARIES) $(DATA) all-local
>  installdirs:
> +	for dir in "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(toolexeclibdir)"; do \
> +	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
> +	done
>  install: install-am
>  install-exec: install-exec-am
>  install-data: install-data-am
> @@ -674,13 +757,13 @@ info: info-am
>  
>  info-am:
>  
> -install-data-am:
> +install-data-am: install-nobase_pkgdataDATA
>  
>  install-dvi: install-dvi-am
>  
>  install-dvi-am:
>  
> -install-exec-am:
> +install-exec-am: install-toolexeclibDATA
>  
>  install-html: install-html-am
>  
> @@ -719,27 +802,43 @@ ps: ps-am
>  
>  ps-am:
>  
> -uninstall-am:
> +uninstall-am: uninstall-nobase_pkgdataDATA uninstall-toolexeclibDATA
>  
>  .MAKE: install-am install-strip
>  
> -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
> -	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
> -	ctags-am distclean distclean-compile distclean-generic \
> -	distclean-libtool distclean-tags dvi dvi-am html html-am info \
> -	info-am install install-am install-data install-data-am \
> -	install-dvi install-dvi-am install-exec install-exec-am \
> -	install-html install-html-am install-info install-info-am \
> -	install-man install-pdf install-pdf-am install-ps \
> -	install-ps-am install-strip installcheck installcheck-am \
> -	installdirs maintainer-clean maintainer-clean-generic \
> -	mostlyclean mostlyclean-compile mostlyclean-generic \
> -	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
> -	uninstall-am
> +.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
> +	clean-generic clean-libtool clean-noinstLTLIBRARIES \
> +	cscopelist-am ctags ctags-am distclean distclean-compile \
> +	distclean-generic distclean-libtool distclean-tags dvi dvi-am \
> +	html html-am info info-am install install-am install-data \
> +	install-data-am install-dvi install-dvi-am install-exec \
> +	install-exec-am install-html install-html-am install-info \
> +	install-info-am install-man install-nobase_pkgdataDATA \
> +	install-pdf install-pdf-am install-ps install-ps-am \
> +	install-strip install-toolexeclibDATA installcheck \
> +	installcheck-am installdirs maintainer-clean \
> +	maintainer-clean-generic mostlyclean mostlyclean-compile \
> +	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
> +	tags tags-am uninstall uninstall-am \
> +	uninstall-nobase_pkgdataDATA uninstall-toolexeclibDATA
>  
>  .PRECIOUS: Makefile
>  
>  
> +# The manifest to be installed uses the relative path between install dirs.
> +libstdc++.modules.json: libstdc++.modules.json.in
> +	relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \
> +		$(toolexeclibdir) $(pkgdatadir)) && \
> +	sed "s,@MODPATH@,$$relpath," $< > $@
> +
> +# The uninstalled manifest uses the absolute path to srcdir.
> +stamp-modules: libstdc++.modules.json.in
> +	sed 's,@MODPATH@,$(srcdir),' $< \
> +	  > ../.libs/libstdc++.modules.json
> +	@touch stamp-modules
> +
> +all-local: stamp-modules
> +
>  vpath % $(top_srcdir)/src/c++23
>  
>  # Use C++26 so that std::filebuf::native_handle() is available.
> diff --git a/libstdc++-v3/src/c++23/libstdc++.modules.json.in b/libstdc++-v3/src/c++23/libstdc++.modules.json.in
> new file mode 100644
> index 00000000000..50714d9c164
> --- /dev/null
> +++ b/libstdc++-v3/src/c++23/libstdc++.modules.json.in
> @@ -0,0 +1,17 @@
> +// C++ module metadata, to install alongside libstdc++.so
> +{
> +  "version": 1,
> +  "revision": 1,
> +  "modules": [
> +    {
> +      "logical-name": "std",
> +      "source-path": "@MODPATH@/modules/std.cc",
> +      "is-std-library": true
> +    },
> +    {
> +      "logical-name": "std.compat",
> +      "source-path": "@MODPATH@/modules/std.compat.cc",
> +      "is-std-library": true
> +    }
> +  ]
> +}
> 
> base-commit: 453d3d90c374d3bb329f1431b7dfb8d0510a88b9
> -- 
> 2.47.0
> 
>
Iain Sandoe Oct. 18, 2024, 4:35 p.m. UTC | #2
> On 18 Oct 2024, at 14:38, Jason Merrill <jason@redhat.com> wrote:
> 
> This patch is not ready for integration, but I'd like to get feedback on the
> approach (and various specific questions below).
> 
> -- 8< --
> 
> This patch introduces an installed source form of module std and std.compat.
> To find them, we install a libstdc++.modules.json file alongside
> libstdc++.so, which tells the build system where the files are and any
> special flags it should use when compiling them (none, in our case).  The
> format is from a proposal in SG15.
> 
> The build system can find this file with
> gcc -print-file-name=libstdc++.modules.json
> 
> It seems preferable to use a relative path from this file to the sources so
> that moving the installation doesn't break the reference, but I didn't see
> any obvious way to compute that without relying on coreutils, perl, or
> python, so I wrote a POSIX shell script for it.
> 
> Currently this installs the sources under $(pkgdata), i.e.
> /usr/share/libstdc++/modules.  It could also make sense to install them
> under $(gxx_include_dir), i.e. /usr/include/c++/15/modules.  And/or the
> subdirectory could be "miu" (module interface unit) instead of "modules".

I’d think that $(gxx_include_dir)/modules would be a good place, since that
allows us to tie it to the GCC version in side-by-side installs.  Presumably that
might also simplify finding the relevant sources?

I guess it could be just “module”, but my vote would be for an obvious name
like that or “std-module” 

> 
> The sources currently have the extension .cc, like other source files.
> Alternatively, they could use one of the module interface unit extensions,
> perhaps .ccm.
> 
> std.cc started with m.cencora's implementation in PR114600.  I've made some
> adjustments, but more is probably desirable, e.g. of the <algorithm>
> handling of namespace ranges, and to remove exports of templates that are
> only specialized in a particular header.
> 
> The std module is missing exports for some newer headers, including some
> that are already implemented (<generator>, <print>, <stop_token>).  I've
> added some FIXMEs where I noticed missing bits.
> 
> Since bits/stdc++.h also intends to include the whole standard library, I
> include it rather than duplicate it.  But stdc++.h comments out <exception>,
> so I include it separately.  Alternatively, we could uncomment it in
> stdc++.h.
> 
> stdc++.h also doesn't include the eternally deprecated <strstream>.  There
> are some other deprecated facilities that I notice are included: <codecvt>
> and float_denorm_style, at least.  It would be nice for L{E,}WG to clarify
> whether module std is intended to include interfaces that were deprecated in
> C++23, since ancient code isn't going to be relying on module std.
> 
> If they are supposed to included, do we also want to keep exporting them in
> C++26, where they are removed from the standard?
> 
> It seemed most convenient for the two files to be monolithic so we don't
> need to worry about include paths.  So the C library names that module
> std.compat exports in both namespace std and :: in module are a block of
> code that is identical in both files, adjusted based on whether the macro
> STD_COMPAT is defined before the block.
> 
> In this implementation std.compat imports std; it would also be valid for it
> to duplicate everything in std.  I see the libc++ std.compat also imports
> std.
> 
> Is it useful for std.cc to live in a subdirectory of c++23 as in this patch, or
> should it be in c++23 itself?  Or elsewhere?

maybe I’m missing a point here .. 

…  is this not the source code that the end-user needs to build to generate
the ’std’ module for their set of flags etc?

So it and the installed headers need to be available in the installation to the
end-user - and maybe it could live alongside the json?

Iain

> 
> This patch doesn't yet provide a convenient way for a user to find std.cc.
> 
> libstdc++-v3/ChangeLog:
> 
> 	* src/c++23/Makefile.am: Add module std/std.compat.
> 	* src/c++23/Makefile.in: Regenerate.
> 	* src/c++23/modules/std.cc: New file.
> 	* src/c++23/modules/std.compat.cc: New file.
> 	* src/c++23/libstdc++.modules.json.in: New file.
> 
> contrib/ChangeLog:
> 
> 	* relpath.sh: New file.
> ---
> libstdc++-v3/src/c++23/modules/std.cc         | 3575 +++++++++++++++++
> libstdc++-v3/src/c++23/modules/std.compat.cc  |  640 +++
> contrib/relpath.sh                            |   70 +
> libstdc++-v3/src/c++23/Makefile.am            |   18 +
> libstdc++-v3/src/c++23/Makefile.in            |  133 +-
> .../src/c++23/libstdc++.modules.json.in       |   17 +
> 6 files changed, 4436 insertions(+), 17 deletions(-)
> create mode 100644 libstdc++-v3/src/c++23/modules/std.cc
> create mode 100644 libstdc++-v3/src/c++23/modules/std.compat.cc
> create mode 100755 contrib/relpath.sh
> create mode 100644 libstdc++-v3/src/c++23/libstdc++.modules.json.in
> 
> diff --git a/libstdc++-v3/src/c++23/modules/std.cc b/libstdc++-v3/src/c++23/modules/std.cc
> new file mode 100644
> index 00000000000..d823b915b9c
> --- /dev/null
> +++ b/libstdc++-v3/src/c++23/modules/std.cc
> @@ -0,0 +1,3575 @@
> +// -*- C++ -*- [std.modules] module std
> +
> +// Copyright The GNU Toolchain Authors.
> +//
> +// This file is part of the GNU ISO C++ Library.  This library 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.
> +
> +// This library 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.
> +
> +// Under Section 7 of GPL version 3, you are granted additional
> +// permissions described in the GCC Runtime Library Exception, version
> +// 3.1, as published by the Free Software Foundation.
> +
> +// You should have received a copy of the GNU General Public License and
> +// a copy of the GCC Runtime Library Exception along with this program;
> +// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +// <http://www.gnu.org/licenses/>.
> +
> +module;
> +
> +#include <bits/stdc++.h>
> +
> +// ??? Commented out in stdc++.h
> +#include <execution>
> +
> +#undef __DEPRECATED
> +#include <strstream>
> +
> +export module std;
> +
> +// **** Any changes to the C library section below must also be made to the
> +// **** verbatim copy in std.compat.cc.
> +
> +// C standard library headers [tab:headers.cpp.c]
> +
> +#ifndef STD_COMPAT
> +#define C_LIB_NAMESPACE namespace std
> +#endif
> +
> +// 19.3 <cassert>
> +// No exports
> +
> +// 23.5.1 <cctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::isalnum;
> +  using std::isalpha;
> +  using std::isblank;
> +  using std::iscntrl;
> +  using std::isdigit;
> +  using std::isgraph;
> +  using std::islower;
> +  using std::isprint;
> +  using std::ispunct;
> +  using std::isspace;
> +  using std::isupper;
> +  using std::isxdigit;
> +  using std::tolower;
> +  using std::toupper;
> +}
> +
> +// 19.4 <cerrno>
> +// No exports
> +
> +// 28.3 <cfenv>
> +export C_LIB_NAMESPACE
> +{
> +  using std::feclearexcept;
> +  using std::fegetenv;
> +  using std::fegetexceptflag;
> +  using std::fegetround;
> +  using std::feholdexcept;
> +  using std::fenv_t;
> +  using std::feraiseexcept;
> +  using std::fesetenv;
> +  using std::fesetexceptflag;
> +  using std::fesetround;
> +  using std::fetestexcept;
> +  using std::feupdateenv;
> +  using std::fexcept_t;
> +}
> +
> +// 17.3.7 <cfloat> [cfloat.syn]
> +// No exports, only provides macros
> +
> +// 31.13.2 <cinttypes>
> +export C_LIB_NAMESPACE
> +{
> +  using std::imaxabs;
> +  using std::imaxdiv;
> +  using std::imaxdiv_t;
> +  using std::strtoimax;
> +  using std::strtoumax;
> +  using std::wcstoimax;
> +  using std::wcstoumax;
> +}
> +
> +// 17.3.6 <climits> [climits.syn]
> +// No exports, only provides macros
> +
> +// 30.5 <clocale>
> +export C_LIB_NAMESPACE
> +{
> +  using std::lconv;
> +  using std::localeconv;
> +  using std::setlocale;
> +  // LC_* macros not exported
> +}
> +
> +// 28.7.1 <cmath>
> +// FIXME missing special functions
> +export C_LIB_NAMESPACE
> +{
> +  using std::abs;
> +  using std::acos;
> +  using std::acosf;
> +  using std::acosh;
> +  using std::acoshf;
> +  using std::acoshl;
> +  using std::acosl;
> +  using std::asin;
> +  using std::asinf;
> +  using std::asinh;
> +  using std::asinhf;
> +  using std::asinhl;
> +  using std::asinl;
> +  using std::atan;
> +  using std::atan2;
> +  using std::atan2f;
> +  using std::atan2l;
> +  using std::atanf;
> +  using std::atanh;
> +  using std::atanhf;
> +  using std::atanhl;
> +  using std::atanl;
> +  using std::cbrt;
> +  using std::cbrtf;
> +  using std::cbrtl;
> +  using std::ceil;
> +  using std::ceilf;
> +  using std::ceill;
> +  using std::copysign;
> +  using std::copysignf;
> +  using std::copysignl;
> +  using std::cos;
> +  using std::cosf;
> +  using std::cosh;
> +  using std::coshf;
> +  using std::coshl;
> +  using std::cosl;
> +  using std::double_t;
> +  using std::erf;
> +  using std::erfc;
> +  using std::erfcf;
> +  using std::erfcl;
> +  using std::erff;
> +  using std::erfl;
> +  using std::exp;
> +  using std::exp2;
> +  using std::exp2f;
> +  using std::exp2l;
> +  using std::expf;
> +  using std::expl;
> +  using std::expm1;
> +  using std::expm1f;
> +  using std::expm1l;
> +  using std::fabs;
> +  using std::fabsf;
> +  using std::fabsl;
> +  using std::fdim;
> +  using std::fdimf;
> +  using std::fdiml;
> +  using std::float_t;
> +  using std::floor;
> +  using std::floorf;
> +  using std::floorl;
> +  using std::fma;
> +  using std::fmaf;
> +  using std::fmal;
> +  using std::fmax;
> +  using std::fmaxf;
> +  using std::fmaxl;
> +  using std::fmin;
> +  using std::fminf;
> +  using std::fminl;
> +  using std::fmod;
> +  using std::fmodf;
> +  using std::fmodl;
> +  using std::fpclassify;
> +  using std::frexp;
> +  using std::frexpf;
> +  using std::frexpl;
> +  using std::hypot;
> +  using std::hypotf;
> +  using std::hypotl;
> +  using std::ilogb;
> +  using std::ilogbf;
> +  using std::ilogbl;
> +  using std::isfinite;
> +  using std::isgreater;
> +  using std::isgreaterequal;
> +  using std::isinf;
> +  using std::isless;
> +  using std::islessequal;
> +  using std::islessgreater;
> +  using std::isnan;
> +  using std::isnormal;
> +  using std::isunordered;
> +  using std::ldexp;
> +  using std::ldexpf;
> +  using std::ldexpl;
> +#ifndef STD_COMPAT
> +  using std::lerp;
> +#endif
> +  using std::lgamma;
> +  using std::lgammaf;
> +  using std::lgammal;
> +  using std::llrint;
> +  using std::llrintf;
> +  using std::llrintl;
> +  using std::llround;
> +  using std::llroundf;
> +  using std::llroundl;
> +  using std::log;
> +  using std::log10;
> +  using std::log10f;
> +  using std::log10l;
> +  using std::log1p;
> +  using std::log1pf;
> +  using std::log1pl;
> +  using std::log2;
> +  using std::log2f;
> +  using std::log2l;
> +  using std::logb;
> +  using std::logbf;
> +  using std::logbl;
> +  using std::logf;
> +  using std::logl;
> +  using std::lrint;
> +  using std::lrintf;
> +  using std::lrintl;
> +  using std::lround;
> +  using std::lroundf;
> +  using std::lroundl;
> +  using std::modf;
> +  using std::modff;
> +  using std::modfl;
> +  using std::nan;
> +  using std::nanf;
> +  using std::nanl;
> +  using std::nearbyint;
> +  using std::nearbyintf;
> +  using std::nearbyintl;
> +  using std::nextafter;
> +  using std::nextafterf;
> +  using std::nextafterl;
> +  using std::nexttoward;
> +  using std::nexttowardf;
> +  using std::nexttowardl;
> +  using std::pow;
> +  using std::powf;
> +  using std::powl;
> +  using std::remainder;
> +  using std::remainderf;
> +  using std::remainderl;
> +  using std::remquo;
> +  using std::remquof;
> +  using std::remquol;
> +  using std::rint;
> +  using std::rintf;
> +  using std::rintl;
> +  using std::round;
> +  using std::roundf;
> +  using std::roundl;
> +  using std::scalbln;
> +  using std::scalblnf;
> +  using std::scalblnl;
> +  using std::scalbn;
> +  using std::scalbnf;
> +  using std::scalbnl;
> +  using std::signbit;
> +  using std::sin;
> +  using std::sinf;
> +  using std::sinh;
> +  using std::sinhf;
> +  using std::sinhl;
> +  using std::sinl;
> +  using std::sqrt;
> +  using std::sqrtf;
> +  using std::sqrtl;
> +  using std::tan;
> +  using std::tanf;
> +  using std::tanh;
> +  using std::tanhf;
> +  using std::tanhl;
> +  using std::tanl;
> +  using std::tgamma;
> +  using std::tgammaf;
> +  using std::tgammal;
> +  using std::trunc;
> +  using std::truncf;
> +  using std::truncl;
> +}
> +
> +// 17.13.3 <csetjmp>
> +export C_LIB_NAMESPACE
> +{
> +  using std::jmp_buf;
> +  using std::longjmp;
> +  // setjmp macro not exported
> +}
> +
> +// 17.13.4 <csignal>
> +export C_LIB_NAMESPACE
> +{
> +  using std::raise;
> +  using std::sig_atomic_t;
> +  using std::signal;
> +  // SIG_* macros not exported
> +}
> +
> +// 17.13.2 <cstdarg>
> +export C_LIB_NAMESPACE
> +{
> +  using std::va_list;
> +  // va_arg and friend macros not exported
> +}
> +
> +// 17.2.1 <cstddef> [cstddef.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::max_align_t;
> +  using std::nullptr_t;
> +  using std::ptrdiff_t;
> +  using std::size_t;
> +#ifndef STD_COMPAT
> +  using std::byte;
> +  using std::operator<<=;
> +  using std::operator<<;
> +  using std::operator>>=;
> +  using std::operator>>;
> +  using std::operator|=;
> +  using std::operator|;
> +  using std::operator&=;
> +  using std::operator&;
> +  using std::operator^=;
> +  using std::operator^;
> +  using std::operator~;
> +  using std::to_integer;
> +#endif
> +  // NULL and offsetof macros not exported
> +}
> +
> +// 17.4 <cstdint>
> +export C_LIB_NAMESPACE
> +{
> +  using std::int8_t;
> +  using std::int16_t;
> +  using std::int32_t;
> +  using std::int64_t;
> +  using std::int_fast16_t;
> +  using std::int_fast32_t;
> +  using std::int_fast64_t;
> +  using std::int_fast8_t;
> +  using std::int_least16_t;
> +  using std::int_least32_t;
> +  using std::int_least64_t;
> +  using std::int_least8_t;
> +  using std::intmax_t;
> +  using std::intptr_t;
> +  using std::uint8_t;
> +  using std::uint16_t;
> +  using std::uint32_t;
> +  using std::uint64_t;
> +  using std::uint_fast16_t;
> +  using std::uint_fast32_t;
> +  using std::uint_fast64_t;
> +  using std::uint_fast8_t;
> +  using std::uint_least16_t;
> +  using std::uint_least32_t;
> +  using std::uint_least64_t;
> +  using std::uint_least8_t;
> +  using std::uintmax_t;
> +  using std::uintptr_t;
> +}
> +
> +// 31.13.1 <cstdio>
> +export C_LIB_NAMESPACE
> +{
> +  using std::clearerr;
> +  using std::fclose;
> +  using std::feof;
> +  using std::ferror;
> +  using std::fflush;
> +  using std::fgetc;
> +  using std::fgetpos;
> +  using std::fgets;
> +  using std::FILE;
> +  using std::fopen;
> +  using std::fpos_t;
> +  using std::fprintf;
> +  using std::fputc;
> +  using std::fputs;
> +  using std::fread;
> +  using std::freopen;
> +  using std::fscanf;
> +  using std::fseek;
> +  using std::fsetpos;
> +  using std::ftell;
> +  using std::fwrite;
> +  using std::getc;
> +  using std::getchar;
> +  using std::perror;
> +  using std::printf;
> +  using std::putc;
> +  using std::putchar;
> +  using std::puts;
> +  using std::remove;
> +  using std::rename;
> +  using std::rewind;
> +  using std::scanf;
> +  using std::setbuf;
> +  using std::setvbuf;
> +  using std::size_t;
> +  using std::snprintf;
> +  using std::sprintf;
> +  using std::sscanf;
> +  using std::tmpfile;
> +  using std::tmpnam;
> +  using std::ungetc;
> +  using std::vfprintf;
> +  using std::vfscanf;
> +  using std::vprintf;
> +  using std::vscanf;
> +  using std::vsnprintf;
> +  using std::vsprintf;
> +  using std::vsscanf;
> +}
> +
> +// 17.2.2 <cstdlib> [cstdlib.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::_Exit;
> +  using std::abort;
> +  using std::abs;
> +  using std::aligned_alloc;
> +  using std::at_quick_exit;
> +  using std::atexit;
> +  using std::atof;
> +  using std::atoi;
> +  using std::atol;
> +  using std::atoll;
> +  using std::bsearch;
> +  using std::calloc;
> +  using std::div;
> +  using std::div_t;
> +  using std::exit;
> +  using std::free;
> +  using std::getenv;
> +  using std::labs;
> +  using std::ldiv;
> +  using std::ldiv_t;
> +  using std::llabs;
> +  using std::lldiv;
> +  using std::lldiv_t;
> +  using std::malloc;
> +  using std::mblen;
> +  using std::mbstowcs;
> +  using std::mbtowc;
> +  using std::qsort;
> +  using std::quick_exit;
> +  using std::rand;
> +  using std::realloc;
> +  using std::size_t;
> +  using std::srand;
> +  using std::strtod;
> +  using std::strtof;
> +  using std::strtol;
> +  using std::strtold;
> +  using std::strtoll;
> +  using std::strtoul;
> +  using std::strtoull;
> +  using std::system;
> +  using std::wcstombs;
> +  using std::wctomb;
> +}
> +
> +// 23.5.3 <cstring>
> +export C_LIB_NAMESPACE
> +{
> +  using std::memchr;
> +  using std::memcmp;
> +  using std::memcpy;
> +  using std::memmove;
> +  using std::memset;
> +  using std::size_t;
> +  using std::strcat;
> +  using std::strchr;
> +  using std::strcmp;
> +  using std::strcoll;
> +  using std::strcpy;
> +  using std::strcspn;
> +  using std::strerror;
> +  using std::strlen;
> +  using std::strncat;
> +  using std::strncmp;
> +  using std::strncpy;
> +  using std::strpbrk;
> +  using std::strrchr;
> +  using std::strspn;
> +  using std::strstr;
> +  using std::strtok;
> +  using std::strxfrm;
> +}
> +
> +// 29.15 <ctime>
> +export C_LIB_NAMESPACE
> +{
> +  using std::asctime;
> +  using std::clock;
> +  using std::clock_t;
> +  using std::ctime;
> +  using std::difftime;
> +  using std::gmtime;
> +  using std::localtime;
> +  using std::mktime;
> +  using std::size_t;
> +  using std::strftime;
> +  using std::time;
> +  using std::time_t;
> +  using std::timespec;
> +  using std::tm;
> +  using std::timespec_get;
> +}
> +
> +// 23.5.5 <cuchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::mbrtoc8;
> +  using std::c8rtomb;
> +  using std::mbrtoc16;
> +  using std::c16rtomb;
> +  using std::mbrtoc32;
> +  using std::c32rtomb;
> +}
> +
> +// 23.5.4 <cwchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::btowc;
> +  using std::fgetwc;
> +  using std::fgetws;
> +  using std::fputwc;
> +  using std::fputws;
> +  using std::fwide;
> +  using std::fwprintf;
> +  using std::fwscanf;
> +  using std::getwc;
> +  using std::getwchar;
> +  using std::mbrlen;
> +  using std::mbrtowc;
> +  using std::mbsinit;
> +  using std::mbsrtowcs;
> +  using std::mbstate_t;
> +  using std::putwc;
> +  using std::putwchar;
> +  using std::size_t;
> +  using std::swprintf;
> +  using std::swscanf;
> +  using std::tm;
> +  using std::ungetwc;
> +  using std::vfwprintf;
> +  using std::vfwscanf;
> +  using std::vswprintf;
> +  using std::vswscanf;
> +  using std::vwprintf;
> +  using std::vwscanf;
> +  using std::wcrtomb;
> +  using std::wcscat;
> +  using std::wcschr;
> +  using std::wcscmp;
> +  using std::wcscoll;
> +  using std::wcscpy;
> +  using std::wcscspn;
> +  using std::wcsftime;
> +  using std::wcslen;
> +  using std::wcsncat;
> +  using std::wcsncmp;
> +  using std::wcsncpy;
> +  using std::wcspbrk;
> +  using std::wcsrchr;
> +  using std::wcsrtombs;
> +  using std::wcsspn;
> +  using std::wcsstr;
> +  using std::wcstod;
> +  using std::wcstof;
> +  using std::wcstok;
> +  using std::wcstol;
> +  using std::wcstold;
> +  using std::wcstoll;
> +  using std::wcstoul;
> +  using std::wcstoull;
> +  using std::wcsxfrm;
> +  using std::wctob;
> +  using std::wint_t;
> +  using std::wmemchr;
> +  using std::wmemcmp;
> +  using std::wmemcpy;
> +  using std::wmemmove;
> +  using std::wmemset;
> +  using std::wprintf;
> +  using std::wscanf;
> +}
> +
> +// 23.5.2 <cwctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::iswalnum;
> +  using std::iswalpha;
> +  using std::iswblank;
> +  using std::iswcntrl;
> +  using std::iswctype;
> +  using std::iswdigit;
> +  using std::iswgraph;
> +  using std::iswlower;
> +  using std::iswprint;
> +  using std::iswpunct;
> +  using std::iswspace;
> +  using std::iswupper;
> +  using std::iswxdigit;
> +  using std::towctrans;
> +  using std::towlower;
> +  using std::towupper;
> +  using std::wctrans;
> +  using std::wctrans_t;
> +  using std::wctype;
> +  using std::wctype_t;
> +  using std::wint_t;
> +}
> +
> +// **** End of C library ****
> +
> +// 27.4 <algorithm>
> +export namespace std
> +{
> +  namespace ranges
> +  {
> +    using std::ranges::in_found_result;
> +    using std::ranges::in_fun_result;
> +    using std::ranges::in_in_out_result;
> +    using std::ranges::in_in_result;
> +    using std::ranges::in_out_out_result;
> +    using std::ranges::in_out_result;
> +    using std::ranges::min_max_result;
> +  }
> +  using std::all_of;
> +  namespace ranges
> +  {
> +    using std::ranges::all_of;
> +  }
> +  using std::any_of;
> +  namespace ranges
> +  {
> +    using std::ranges::any_of;
> +  }
> +  using std::none_of;
> +  namespace ranges
> +  {
> +    using std::ranges::none_of;
> +  }
> +  using std::for_each;
> +  namespace ranges
> +  {
> +    using std::ranges::for_each;
> +    using std::ranges::for_each_result;
> +  }
> +  using std::for_each_n;
> +  namespace ranges
> +  {
> +    using std::ranges::for_each_n;
> +    using std::ranges::for_each_n_result;
> +  }
> +  using std::find;
> +  using std::find_if;
> +  using std::find_if_not;
> +  namespace ranges
> +  {
> +    using std::ranges::find;
> +    using std::ranges::find_if;
> +    using std::ranges::find_if_not;
> +  }
> +  using std::find_end;
> +  namespace ranges
> +  {
> +    using std::ranges::find_end;
> +  }
> +  using std::find_first_of;
> +  namespace ranges
> +  {
> +    using std::ranges::find_first_of;
> +  }
> +  using std::adjacent_find;
> +  namespace ranges
> +  {
> +    using std::ranges::adjacent_find;
> +  }
> +  using std::count;
> +  using std::count_if;
> +  namespace ranges
> +  {
> +    using std::ranges::count;
> +    using std::ranges::count_if;
> +  }
> +  using std::mismatch;
> +  namespace ranges
> +  {
> +    using std::ranges::mismatch;
> +    using std::ranges::mismatch_result;
> +  }
> +  using std::equal;
> +  namespace ranges
> +  {
> +    using std::ranges::equal;
> +  }
> +  using std::is_permutation;
> +  namespace ranges
> +  {
> +    using std::ranges::is_permutation;
> +  }
> +  using std::search;
> +  namespace ranges
> +  {
> +    using std::ranges::search;
> +  }
> +  using std::search_n;
> +  namespace ranges
> +  {
> +    using std::ranges::search_n;
> +  }
> +  namespace ranges
> +  {}
> +  using std::copy;
> +  namespace ranges
> +  {
> +    using std::ranges::copy;
> +    using std::ranges::copy_result;
> +  }
> +  using std::copy_n;
> +  namespace ranges
> +  {
> +    using std::ranges::copy_n;
> +    using std::ranges::copy_n_result;
> +  }
> +  using std::copy_if;
> +  namespace ranges
> +  {
> +    using std::ranges::copy_if;
> +    using std::ranges::copy_if_result;
> +  }
> +  using std::copy_backward;
> +  namespace ranges
> +  {
> +    using std::ranges::copy_backward;
> +    using std::ranges::copy_backward_result;
> +  }
> +  using std::move;
> +  namespace ranges
> +  {
> +    using std::ranges::move;
> +    using std::ranges::move_result;
> +  }
> +  using std::move_backward;
> +  namespace ranges
> +  {
> +    using std::ranges::move_backward;
> +    using std::ranges::move_backward_result;
> +  }
> +  using std::swap_ranges;
> +  namespace ranges
> +  {
> +    using std::ranges::swap_ranges;
> +    using std::ranges::swap_ranges_result;
> +  }
> +  using std::iter_swap;
> +  using std::transform;
> +  namespace ranges
> +  {
> +    using std::ranges::binary_transform_result;
> +    using std::ranges::transform;
> +    using std::ranges::unary_transform_result;
> +  }
> +  using std::replace;
> +  using std::replace_if;
> +  namespace ranges
> +  {
> +    using std::ranges::replace;
> +    using std::ranges::replace_if;
> +  }
> +  using std::replace_copy;
> +  using std::replace_copy_if;
> +  namespace ranges
> +  {
> +    using std::ranges::replace_copy;
> +    using std::ranges::replace_copy_if;
> +    using std::ranges::replace_copy_if_result;
> +    using std::ranges::replace_copy_result;
> +  }
> +  using std::fill;
> +  using std::fill_n;
> +  namespace ranges
> +  {
> +    using std::ranges::fill;
> +    using std::ranges::fill_n;
> +  }
> +  using std::generate;
> +  using std::generate_n;
> +  namespace ranges
> +  {
> +    using std::ranges::generate;
> +    using std::ranges::generate_n;
> +  }
> +  using std::remove;
> +  using std::remove_if;
> +  namespace ranges
> +  {
> +    using std::ranges::remove;
> +    using std::ranges::remove_if;
> +  }
> +  using std::remove_copy;
> +  using std::remove_copy_if;
> +  namespace ranges
> +  {
> +    using std::ranges::remove_copy;
> +    using std::ranges::remove_copy_if;
> +    using std::ranges::remove_copy_if_result;
> +    using std::ranges::remove_copy_result;
> +  }
> +  using std::unique;
> +  namespace ranges
> +  {
> +    using std::ranges::unique;
> +  }
> +  using std::unique_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::unique_copy;
> +    using std::ranges::unique_copy_result;
> +  }
> +  using std::reverse;
> +  namespace ranges
> +  {
> +    using std::ranges::reverse;
> +  }
> +  using std::reverse_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::reverse_copy;
> +    using std::ranges::reverse_copy_result;
> +  }
> +  using std::rotate;
> +  namespace ranges
> +  {
> +    using std::ranges::rotate;
> +  }
> +  using std::rotate_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::rotate_copy;
> +    using std::ranges::rotate_copy_result;
> +  }
> +  using std::sample;
> +  namespace ranges
> +  {
> +    using std::ranges::sample;
> +  }
> +  using std::shuffle;
> +  namespace ranges
> +  {
> +    using std::ranges::shuffle;
> +  }
> +  using std::shift_left;
> +  namespace ranges
> +  {}
> +  using std::shift_right;
> +  namespace ranges
> +  {}
> +  using std::sort;
> +  namespace ranges
> +  {
> +    using std::ranges::sort;
> +  }
> +  using std::stable_sort;
> +  namespace ranges
> +  {
> +    using std::ranges::stable_sort;
> +  }
> +  using std::partial_sort;
> +  namespace ranges
> +  {
> +    using std::ranges::partial_sort;
> +  }
> +  using std::partial_sort_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::partial_sort_copy;
> +    using std::ranges::partial_sort_copy_result;
> +  }
> +  using std::is_sorted;
> +  using std::is_sorted_until;
> +  namespace ranges
> +  {
> +    using std::ranges::is_sorted;
> +    using std::ranges::is_sorted_until;
> +  }
> +  using std::nth_element;
> +  namespace ranges
> +  {
> +    using std::ranges::nth_element;
> +  }
> +  using std::lower_bound;
> +  namespace ranges
> +  {
> +    using std::ranges::lower_bound;
> +  }
> +  using std::upper_bound;
> +  namespace ranges
> +  {
> +    using std::ranges::upper_bound;
> +  }
> +  using std::equal_range;
> +  namespace ranges
> +  {
> +    using std::ranges::equal_range;
> +  }
> +  using std::binary_search;
> +  namespace ranges
> +  {
> +    using std::ranges::binary_search;
> +  }
> +  using std::is_partitioned;
> +  namespace ranges
> +  {
> +    using std::ranges::is_partitioned;
> +  }
> +  using std::partition;
> +  namespace ranges
> +  {
> +    using std::ranges::partition;
> +  }
> +  using std::stable_partition;
> +  namespace ranges
> +  {
> +    using std::ranges::stable_partition;
> +  }
> +  using std::partition_copy;
> +  namespace ranges
> +  {
> +    using std::ranges::partition_copy;
> +    using std::ranges::partition_copy_result;
> +  }
> +  using std::partition_point;
> +  namespace ranges
> +  {
> +    using std::ranges::partition_point;
> +  }
> +  using std::merge;
> +  namespace ranges
> +  {
> +    using std::ranges::merge;
> +    using std::ranges::merge_result;
> +  }
> +  using std::inplace_merge;
> +  namespace ranges
> +  {
> +    using std::ranges::inplace_merge;
> +  }
> +  using std::includes;
> +  namespace ranges
> +  {
> +    using std::ranges::includes;
> +  }
> +  using std::set_union;
> +  namespace ranges
> +  {
> +    using std::ranges::set_union;
> +    using std::ranges::set_union_result;
> +  }
> +  using std::set_intersection;
> +  namespace ranges
> +  {
> +    using std::ranges::set_intersection;
> +    using std::ranges::set_intersection_result;
> +  }
> +  using std::set_difference;
> +  namespace ranges
> +  {
> +    using std::ranges::set_difference;
> +    using std::ranges::set_difference_result;
> +  }
> +  using std::set_symmetric_difference;
> +  namespace ranges
> +  {
> +    using std::ranges::set_symmetric_difference;
> +    using std::ranges::set_symmetric_difference_result;
> +  }
> +  using std::push_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::push_heap;
> +  }
> +  using std::pop_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::pop_heap;
> +  }
> +  using std::make_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::make_heap;
> +  }
> +  using std::sort_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::sort_heap;
> +  }
> +  using std::is_heap;
> +  namespace ranges
> +  {
> +    using std::ranges::is_heap;
> +  }
> +  using std::is_heap_until;
> +  namespace ranges
> +  {
> +    using std::ranges::is_heap_until;
> +  }
> +  using std::min;
> +  namespace ranges
> +  {
> +    using std::ranges::min;
> +  }
> +  using std::max;
> +  namespace ranges
> +  {
> +    using std::ranges::max;
> +  }
> +  using std::minmax;
> +  namespace ranges
> +  {
> +    using std::ranges::minmax;
> +    using std::ranges::minmax_result;
> +  }
> +  using std::min_element;
> +  namespace ranges
> +  {
> +    using std::ranges::min_element;
> +  }
> +  using std::max_element;
> +  namespace ranges
> +  {
> +    using std::ranges::max_element;
> +  }
> +  using std::minmax_element;
> +  namespace ranges
> +  {
> +    using std::ranges::minmax_element;
> +    using std::ranges::minmax_element_result;
> +  }
> +  using std::clamp;
> +  namespace ranges
> +  {
> +    using std::ranges::clamp;
> +  }
> +  using std::lexicographical_compare;
> +  namespace ranges
> +  {
> +    using std::ranges::lexicographical_compare;
> +  }
> +  using std::lexicographical_compare_three_way;
> +  using std::next_permutation;
> +  namespace ranges
> +  {
> +    using std::ranges::next_permutation;
> +    using std::ranges::next_permutation_result;
> +  }
> +  using std::prev_permutation;
> +  namespace ranges
> +  {
> +    using std::ranges::prev_permutation;
> +    using std::ranges::prev_permutation_result;
> +  }
> +}
> +
> +// 22.7.2 <any>
> +#if __cpp_lib_any
> +export namespace std
> +{
> +  using std::any;
> +  using std::any_cast;
> +  using std::bad_any_cast;
> +  using std::make_any;
> +  using std::swap;
> +}
> +#endif
> +
> +// 24.3.2 <array>
> +export namespace std
> +{
> +  using std::array;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::get;
> +  using std::swap;
> +  using std::to_array;
> +  using std::tuple_element;
> +  using std::tuple_size;
> +}
> +
> +// 33.5.2 <atomic>
> +export namespace std
> +{
> +  using std::atomic;
> +  using std::atomic_bool;
> +  using std::atomic_char;
> +  using std::atomic_char16_t;
> +  using std::atomic_char32_t;
> +  using std::atomic_char8_t;
> +  using std::atomic_compare_exchange_strong;
> +  using std::atomic_compare_exchange_strong_explicit;
> +  using std::atomic_compare_exchange_weak;
> +  using std::atomic_compare_exchange_weak_explicit;
> +  using std::atomic_exchange;
> +  using std::atomic_exchange_explicit;
> +  using std::atomic_fetch_add;
> +  using std::atomic_fetch_add_explicit;
> +  using std::atomic_fetch_and;
> +  using std::atomic_fetch_and_explicit;
> +  using std::atomic_fetch_or;
> +  using std::atomic_fetch_or_explicit;
> +  using std::atomic_fetch_sub;
> +  using std::atomic_fetch_sub_explicit;
> +  using std::atomic_fetch_xor;
> +  using std::atomic_fetch_xor_explicit;
> +  using std::atomic_flag;
> +  using std::atomic_flag_clear;
> +  using std::atomic_flag_clear_explicit;
> +  using std::atomic_flag_notify_all;
> +  using std::atomic_flag_notify_one;
> +  using std::atomic_flag_test;
> +  using std::atomic_flag_test_and_set;
> +  using std::atomic_flag_test_and_set_explicit;
> +  using std::atomic_flag_test_explicit;
> +  using std::atomic_flag_wait;
> +  using std::atomic_flag_wait_explicit;
> +  using std::atomic_init;
> +  using std::atomic_int;
> +  using std::atomic_int16_t;
> +  using std::atomic_int32_t;
> +  using std::atomic_int64_t;
> +  using std::atomic_int8_t;
> +  using std::atomic_int_fast16_t;
> +  using std::atomic_int_fast32_t;
> +  using std::atomic_int_fast64_t;
> +  using std::atomic_int_fast8_t;
> +  using std::atomic_int_least16_t;
> +  using std::atomic_int_least32_t;
> +  using std::atomic_int_least64_t;
> +  using std::atomic_int_least8_t;
> +  using std::atomic_intmax_t;
> +  using std::atomic_intptr_t;
> +  using std::atomic_is_lock_free;
> +  using std::atomic_llong;
> +  using std::atomic_load;
> +  using std::atomic_load_explicit;
> +  using std::atomic_long;
> +  using std::atomic_notify_all;
> +  using std::atomic_notify_one;
> +  using std::atomic_ptrdiff_t;
> +  using std::atomic_schar;
> +  using std::atomic_short;
> +  using std::atomic_signal_fence;
> +  using std::atomic_signed_lock_free;
> +  using std::atomic_size_t;
> +  using std::atomic_store;
> +  using std::atomic_store_explicit;
> +  using std::atomic_thread_fence;
> +  using std::atomic_uchar;
> +  using std::atomic_uint;
> +  using std::atomic_uint16_t;
> +  using std::atomic_uint32_t;
> +  using std::atomic_uint64_t;
> +  using std::atomic_uint8_t;
> +  using std::atomic_uint_fast16_t;
> +  using std::atomic_uint_fast32_t;
> +  using std::atomic_uint_fast64_t;
> +  using std::atomic_uint_fast8_t;
> +  using std::atomic_uint_least16_t;
> +  using std::atomic_uint_least32_t;
> +  using std::atomic_uint_least64_t;
> +  using std::atomic_uint_least8_t;
> +  using std::atomic_uintmax_t;
> +  using std::atomic_uintptr_t;
> +  using std::atomic_ullong;
> +  using std::atomic_ulong;
> +  using std::atomic_unsigned_lock_free;
> +  using std::atomic_ushort;
> +  using std::atomic_wait;
> +  using std::atomic_wait_explicit;
> +  using std::atomic_wchar_t;
> +  using std::kill_dependency;
> +  using std::memory_order;
> +  using std::memory_order_acq_rel;
> +  using std::memory_order_acquire;
> +  using std::memory_order_consume;
> +  using std::memory_order_relaxed;
> +  using std::memory_order_release;
> +  using std::memory_order_seq_cst;
> +  // ATOMIC_*_LOCK_FREE not exported
> +}
> +
> +// 33.9.3 <barrier>
> +#if __cpp_lib_barrier
> +export namespace std
> +{
> +  using std::barrier;
> +}
> +#endif
> +
> +// 22.15 <bit>
> +export namespace std
> +{
> +  using std::bit_cast;
> +  using std::bit_ceil;
> +  using std::bit_floor;
> +  using std::bit_width;
> +  using std::countl_one;
> +  using std::countl_zero;
> +  using std::countr_one;
> +  using std::countr_zero;
> +  using std::endian;
> +  using std::has_single_bit;
> +  using std::popcount;
> +  using std::rotl;
> +  using std::rotr;
> +}
> +
> +// 22.9 <bitset>
> +#if __cpp_lib_bitset
> +export namespace std
> +{
> +  using std::bitset;
> +  using std::operator&;
> +  using std::operator|;
> +  using std::operator^;
> +  using std::operator>>;
> +  using std::operator<<;
> +  using std::hash;
> +}
> +#endif
> +
> +// 22.13 <charconv>
> +export namespace std
> +{
> +  using std::chars_format;
> +  using std::operator&;
> +  using std::operator&=;
> +  using std::operator^;
> +  using std::operator^=;
> +  using std::operator|;
> +  using std::operator|=;
> +  using std::operator~;
> +  using std::from_chars;
> +  using std::from_chars_result;
> +  using std::to_chars;
> +  using std::to_chars_result;
> +}
> +
> +// 29.2 <chrono>
> +#if __cpp_lib_chrono
> +export namespace std
> +{
> +  namespace chrono
> +  {
> +    using std::chrono::duration;
> +    using std::chrono::time_point;
> +  }
> +  using std::common_type;
> +  namespace chrono
> +  {
> +    using std::chrono::duration_values;
> +    using std::chrono::treat_as_floating_point;
> +    using std::chrono::treat_as_floating_point_v;
> +    using std::chrono::operator+;
> +    using std::chrono::operator-;
> +    using std::chrono::operator*;
> +    using std::chrono::operator/;
> +    using std::chrono::operator%;
> +    using std::chrono::operator==;
> +    using std::chrono::operator<;
> +    using std::chrono::operator>;
> +    using std::chrono::operator<=;
> +    using std::chrono::operator>=;
> +    using std::chrono::operator<=>;
> +    using std::chrono::ceil;
> +    using std::chrono::duration_cast;
> +    using std::chrono::floor;
> +    using std::chrono::round;
> +    using std::chrono::operator<<;
> +    using std::chrono::abs;
> +    using std::chrono::day;
> +    using std::chrono::days;
> +    using std::chrono::file_clock;
> +    using std::chrono::file_time;
> +    using std::chrono::hh_mm_ss;
> +    using std::chrono::high_resolution_clock;
> +    using std::chrono::hours;
> +    using std::chrono::is_am;
> +    using std::chrono::is_pm;
> +    using std::chrono::last_spec;
> +    using std::chrono::local_days;
> +    using std::chrono::local_seconds;
> +    using std::chrono::local_t;
> +    using std::chrono::local_time;
> +    using std::chrono::make12;
> +    using std::chrono::make24;
> +    using std::chrono::microseconds;
> +    using std::chrono::milliseconds;
> +    using std::chrono::minutes;
> +    using std::chrono::month;
> +    using std::chrono::month_day;
> +    using std::chrono::month_day_last;
> +    using std::chrono::month_weekday;
> +    using std::chrono::month_weekday_last;
> +    using std::chrono::months;
> +    using std::chrono::nanoseconds;
> +    using std::chrono::seconds;
> +    using std::chrono::steady_clock;
> +    using std::chrono::sys_days;
> +    using std::chrono::sys_seconds;
> +    using std::chrono::sys_time;
> +    using std::chrono::system_clock;
> +    using std::chrono::time_point_cast;
> +    using std::chrono::weekday;
> +    using std::chrono::weekday_indexed;
> +    using std::chrono::weekday_last;
> +    using std::chrono::weeks;
> +    using std::chrono::year;
> +    using std::chrono::year_month;
> +    using std::chrono::year_month_day;
> +    using std::chrono::year_month_day_last;
> +    using std::chrono::year_month_weekday;
> +    using std::chrono::year_month_weekday_last;
> +    using std::chrono::years;
> +  }
> +  using std::formatter;
> +  namespace chrono
> +  {
> +    using std::chrono::April;
> +    using std::chrono::August;
> +    using std::chrono::December;
> +    using std::chrono::February;
> +    using std::chrono::Friday;
> +    using std::chrono::January;
> +    using std::chrono::July;
> +    using std::chrono::June;
> +    using std::chrono::last;
> +    using std::chrono::March;
> +    using std::chrono::May;
> +    using std::chrono::Monday;
> +    using std::chrono::November;
> +    using std::chrono::October;
> +    using std::chrono::Saturday;
> +    using std::chrono::September;
> +    using std::chrono::Sunday;
> +    using std::chrono::Thursday;
> +    using std::chrono::Tuesday;
> +    using std::chrono::Wednesday;
> +  }
> +}
> +export namespace std::inline literals::inline chrono_literals
> +{
> +  using std::literals::chrono_literals::operator""h;
> +  using std::literals::chrono_literals::operator""min;
> +  using std::literals::chrono_literals::operator""s;
> +  using std::literals::chrono_literals::operator""ms;
> +  using std::literals::chrono_literals::operator""us;
> +  using std::literals::chrono_literals::operator""ns;
> +  using std::literals::chrono_literals::operator""d;
> +  using std::literals::chrono_literals::operator""y;
> +}
> +#endif // __cpp_lib_chrono
> +
> +// <codecvt>: deprecated C++17, removed C++26
> +export namespace std
> +{
> +  using std::codecvt_mode;
> +  using std::codecvt_utf16;
> +  using std::codecvt_utf8;
> +  using std::codecvt_utf8_utf16;
> +}
> +
> +// 17.11.1 <compare>
> +#if __cpp_lib_three_way_comparison
> +export namespace std
> +{
> +  using std::common_comparison_category;
> +  using std::common_comparison_category_t;
> +  using std::compare_three_way;
> +  using std::compare_three_way_result;
> +  using std::compare_three_way_result_t;
> +  using std::is_eq;
> +  using std::is_gt;
> +  using std::is_gteq;
> +  using std::is_lt;
> +  using std::is_lteq;
> +  using std::is_neq;
> +  using std::partial_ordering;
> +  using std::strong_ordering;
> +  using std::three_way_comparable;
> +  using std::three_way_comparable_with;
> +  using std::weak_ordering;
> +  using std::compare_partial_order_fallback;
> +  using std::compare_strong_order_fallback;
> +  using std::compare_weak_order_fallback;
> +  using std::partial_order;
> +  using std::strong_order;
> +  using std::weak_order;
> +}
> +#endif // __cpp_lib_three_way_comparison
> +
> +// 28.4 <complex>
> +export namespace std
> +{
> +  using std::complex;
> +  using std::operator+;
> +  using std::operator-;
> +  using std::operator*;
> +  using std::operator/;
> +  using std::operator==;
> +  using std::operator>>;
> +  using std::operator<<;
> +  using std::abs;
> +  using std::acos;
> +  using std::acosh;
> +  using std::arg;
> +  using std::asin;
> +  using std::asinh;
> +  using std::atan;
> +  using std::atanh;
> +  using std::conj;
> +  using std::cos;
> +  using std::cosh;
> +  using std::exp;
> +  using std::imag;
> +  using std::log;
> +  using std::log10;
> +  using std::norm;
> +  using std::polar;
> +  using std::pow;
> +  using std::proj;
> +  using std::real;
> +  using std::sin;
> +  using std::sinh;
> +  using std::sqrt;
> +  using std::tan;
> +  using std::tanh;
> +  using std::operator""il;
> +  using std::operator""i;
> +  using std::operator""if;
> +}
> +
> +// 18 <concepts>
> +#if __cpp_lib_concepts
> +export namespace std
> +{
> +  using std::assignable_from;
> +  using std::common_reference_with;
> +  using std::common_with;
> +  using std::convertible_to;
> +  using std::derived_from;
> +  using std::floating_point;
> +  using std::integral;
> +  using std::same_as;
> +  using std::signed_integral;
> +  using std::unsigned_integral;
> +  namespace ranges
> +  {
> +    using std::ranges::swap;
> +  }
> +  using std::constructible_from;
> +  using std::copy_constructible;
> +  using std::copyable;
> +  using std::default_initializable;
> +  using std::destructible;
> +  using std::equality_comparable;
> +  using std::equality_comparable_with;
> +  using std::equivalence_relation;
> +  using std::invocable;
> +  using std::movable;
> +  using std::move_constructible;
> +  using std::predicate;
> +  using std::regular;
> +  using std::regular_invocable;
> +  using std::relation;
> +  using std::semiregular;
> +  using std::strict_weak_order;
> +  using std::swappable;
> +  using std::swappable_with;
> +  using std::totally_ordered;
> +  using std::totally_ordered_with;
> +}
> +#endif
> +
> +// 33.7 <condition_variable>
> +export namespace std
> +{
> +  using std::condition_variable;
> +  using std::condition_variable_any;
> +  using std::cv_status;
> +  using std::notify_all_at_thread_exit;
> +}
> +
> +// 17.12.2 <coroutine>
> +#if __cpp_lib_coroutine
> +export namespace std
> +{
> +  using std::coroutine_handle;
> +  using std::coroutine_traits;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::hash;
> +  using std::noop_coroutine;
> +  using std::noop_coroutine_handle;
> +  using std::noop_coroutine_promise;
> +  using std::suspend_always;
> +  using std::suspend_never;
> +}
> +#endif // __cpp_lib_coroutine
> +
> +// 22.16 <debugging>
> +#if __cpp_lib_debugging
> +export namespace std
> +{
> +  using std::breakpoint;
> +  using std::breakpoint_if_debugging;
> +  using std::is_debugger_present;
> +}
> +#endif
> +
> +// 24.3 <deque>
> +export namespace std
> +{
> +  using std::deque;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::deque;
> +  }
> +}
> +
> +// 17.9.2 <exception>
> +export namespace std
> +{
> +  using std::bad_exception;
> +  using std::current_exception;
> +  using std::exception;
> +  using std::exception_ptr;
> +  using std::get_terminate;
> +  using std::make_exception_ptr;
> +  using std::nested_exception;
> +  using std::rethrow_exception;
> +  using std::rethrow_if_nested;
> +  using std::set_terminate;
> +  using std::terminate;
> +  using std::terminate_handler;
> +  using std::throw_with_nested;
> +  using std::uncaught_exception;
> +  using std::uncaught_exceptions;
> +}
> +
> +// 34.4 <execution>
> +#if __cpp_lib_execution
> +export namespace std
> +{
> +  using std::is_execution_policy;
> +  using std::is_execution_policy_v;
> +  namespace execution
> +  {
> +    using std::execution::sequenced_policy;
> +    using std::execution::parallel_policy;
> +    using std::execution::parallel_unsequenced_policy;
> +    using std::execution::unsequenced_policy;
> +    using std::execution::seq;
> +    using std::execution::par;
> +    using std::execution::par_unseq;
> +    using std::execution::unseq;
> +  }
> +#if __cpp_lib_senders
> +  using std::forwarding_query_t;
> +  using std::get_allocator_t;
> +  using std::get_stop_token_t;
> +  using std::forwarding_query;
> +  using std::get_allocator;
> +  using std::get_stop_token;
> +  using std::stop_token_of_t;
> +  namespace execution
> +  {
> +    using std::execution::get_domain_t;
> +    using std::execution::get_scheduler_t;
> +    using std::execution::get_delegation_scheduler_t;
> +    using std::execution::get_forward_progress_guarantee_t;
> +    using std::execution::get_completion_scheduler_t;
> +    using std::execution::get_domain;
> +    using std::execution::get_scheduler;
> +    using std::execution::get_delegation_scheduler;
> +    using std::execution::forward_progress_guarantee;
> +    using std::execution::get_forward_progress_guarantee;
> +    using std::execution::get_completion_scheduler;
> +    using std::execution::empty_env;
> +    using std::execution::get_env_t;
> +    using std::execution::get_env;
> +    using std::execution::env_of_t;
> +    using std::execution::default_domain;
> +    using std::execution::scheduler_t;
> +    using std::execution::scheduler;
> +    using std::execution::receiver_t;
> +    using std::execution::receiver;
> +    using std::execution::receiver_of;
> +    using std::execution::set_value_t;
> +    using std::execution::set_error_t;
> +    using std::execution::set_stopped_t;
> +    using std::execution::set_value;
> +    using std::execution::set_error;
> +    using std::execution::set_stopped;
> +    using std::execution::operation_state_t;
> +    using std::execution::operation_state;
> +    using std::execution::start_t;
> +    using std::execution::start;
> +    using std::execution::sender_t;
> +    using std::execution::sender;
> +    using std::execution::sender_in;
> +    using std::execution::sender_to;
> +    using std::execution::get_completion_signatures_t;
> +    using std::execution::get_completion_signatures;
> +    using std::execution::completion_signatures_of_t;
> +    using std::execution::value_types_of_t;
> +    using std::execution::error_types_of_t;
> +    using std::execution::sends_stopped;
> +    using std::execution::tag_of_t;
> +    using std::execution::transform_sender;
> +    using std::execution::transform_env;
> +    using std::execution::apply_sender;
> +    using std::execution::connect_t;
> +    using std::execution::connect;
> +    using std::execution::connect_result_t;
> +    using std::execution::just_t;
> +    using std::execution::just_error_t;
> +    using std::execution::just_stopped_t;
> +    using std::execution::schedule_t;
> +    using std::execution::just;
> +    using std::execution::just_error;
> +    using std::execution::just_stopped;
> +    using std::execution::schedule;
> +    using std::execution::read_env;
> +    using std::execution::schedule_result_t;
> +    using std::execution::sender_adaptor_closure;
> +    using std::execution::starts_on_t;
> +    using std::execution::continues_on_t;
> +    using std::execution::on_t;
> +    using std::execution::schedule_from_t;
> +    using std::execution::then_t;
> +    using std::execution::upon_error_t;
> +    using std::execution::upon_stopped_t;
> +    using std::execution::let_value_t;
> +    using std::execution::let_error_t;
> +    using std::execution::let_stopped_t;
> +    using std::execution::bulk_t;
> +    using std::execution::split_t;
> +    using std::execution::when_all_t;
> +    using std::execution::when_all_with_variant_t;
> +    using std::execution::into_variant_t;
> +    using std::execution::stopped_as_optional_t;
> +    using std::execution::stopped_as_error_t;
> +    using std::execution::starts_on;
> +    using std::execution::continues_on;
> +    using std::execution::on;
> +    using std::execution::schedule_from;
> +    using std::execution::then;
> +    using std::execution::upon_error;
> +    using std::execution::upon_stopped;
> +    using std::execution::let_value;
> +    using std::execution::let_error;
> +    using std::execution::let_stopped;
> +    using std::execution::bulk;
> +    using std::execution::split;
> +    using std::execution::when_all;
> +    using std::execution::when_all_with_variant;
> +    using std::execution::into_variant;
> +    using std::execution::stopped_as_optional;
> +    using std::execution::stopped_as_error;
> +    using std::execution::completion_signatures;
> +    using std::execution::transform_completion_signatures;
> +    using std::execution::transform_completion_signatures_of;
> +    using std::execution::run_loop;
> +  }
> +  namespace this_thread
> +  {
> +    using std::this_thread::sync_wait_t;
> +    using std::this_thread::sync_wait_with_variant_t;
> +    using std::this_thread::sync_wait;
> +    using std::this_thread::sync_wait_with_variant;
> +  }
> +#endif // __cpp_lib_senders
> +}
> +#endif // __cpp_lib_execution
> +
> +// 22.8 <expected>
> +#if __cpp_lib_expected
> +export namespace std
> +{
> +  using std::unexpected;
> +  using std::bad_expected_access;
> +  using std::unexpect_t;
> +  using std::unexpect;
> +  using std::expected;
> +}
> +#endif
> +
> +// <filesystem>
> +#if __cpp_lib_filesystem
> +export namespace std::filesystem
> +{
> +  using std::filesystem::begin;
> +  using std::filesystem::copy_options;
> +  using std::filesystem::directory_entry;
> +  using std::filesystem::directory_iterator;
> +  using std::filesystem::directory_options;
> +  using std::filesystem::end;
> +  using std::filesystem::file_status;
> +  using std::filesystem::file_time_type;
> +  using std::filesystem::file_type;
> +  using std::filesystem::filesystem_error;
> +  using std::filesystem::hash_value;
> +  using std::filesystem::path;
> +  using std::filesystem::perm_options;
> +  using std::filesystem::perms;
> +  using std::filesystem::recursive_directory_iterator;
> +  using std::filesystem::space_info;
> +  using std::filesystem::swap;
> +  using std::filesystem::operator&;
> +  using std::filesystem::operator&=;
> +  using std::filesystem::operator^;
> +  using std::filesystem::operator^=;
> +  using std::filesystem::operator|;
> +  using std::filesystem::operator|=;
> +  using std::filesystem::operator~;
> +  using std::filesystem::absolute;
> +  using std::filesystem::canonical;
> +  using std::filesystem::copy;
> +  using std::filesystem::copy_file;
> +  using std::filesystem::copy_symlink;
> +  using std::filesystem::create_directories;
> +  using std::filesystem::create_directory;
> +  using std::filesystem::create_directory_symlink;
> +  using std::filesystem::create_hard_link;
> +  using std::filesystem::create_symlink;
> +  using std::filesystem::current_path;
> +  using std::filesystem::equivalent;
> +  using std::filesystem::exists;
> +  using std::filesystem::file_size;
> +  using std::filesystem::hard_link_count;
> +  using std::filesystem::is_block_file;
> +  using std::filesystem::is_character_file;
> +  using std::filesystem::is_directory;
> +  using std::filesystem::is_empty;
> +  using std::filesystem::is_fifo;
> +  using std::filesystem::is_other;
> +  using std::filesystem::is_regular_file;
> +  using std::filesystem::is_socket;
> +  using std::filesystem::is_symlink;
> +  using std::filesystem::last_write_time;
> +  using std::filesystem::permissions;
> +  using std::filesystem::proximate;
> +  using std::filesystem::read_symlink;
> +  using std::filesystem::relative;
> +  using std::filesystem::remove;
> +  using std::filesystem::remove_all;
> +  using std::filesystem::rename;
> +  using std::filesystem::resize_file;
> +  using std::filesystem::space;
> +  using std::filesystem::status;
> +  using std::filesystem::status_known;
> +  using std::filesystem::symlink_status;
> +  using std::filesystem::temp_directory_path;
> +  using std::filesystem::u8path;
> +  using std::filesystem::weakly_canonical;
> +}
> +#endif // __cpp_lib_filesystem
> +
> +// <flat_map>
> +
> +// <flat_set>
> +
> +// <format>
> +export namespace std
> +{
> +  using std::basic_format_arg;
> +  using std::basic_format_args;
> +  using std::basic_format_context;
> +  using std::basic_format_parse_context;
> +  using std::basic_format_string;
> +  using std::format;
> +  using std::format_args;
> +  using std::format_context;
> +  using std::format_error;
> +  using std::format_parse_context;
> +  using std::format_string;
> +  using std::format_to;
> +  using std::format_to_n;
> +  using std::format_to_n_result;
> +  using std::formatted_size;
> +  using std::formatter;
> +  using std::make_format_args;
> +  using std::make_wformat_args;
> +  using std::vformat;
> +  using std::vformat_to;
> +  using std::visit_format_arg;
> +  using std::wformat_args;
> +  using std::wformat_context;
> +  using std::wformat_parse_context;
> +  using std::wformat_string;
> +}
> +
> +// <forward_list>
> +export namespace std
> +{
> +  using std::forward_list;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::forward_list;
> +  }
> +}
> +
> +// <fstream>
> +export namespace std
> +{
> +  using std::basic_filebuf;
> +  using std::basic_fstream;
> +  using std::basic_ifstream;
> +  using std::basic_ofstream;
> +  using std::filebuf;
> +  using std::fstream;
> +  using std::ifstream;
> +  using std::ofstream;
> +  using std::swap;
> +  using std::wfilebuf;
> +  using std::wfstream;
> +  using std::wifstream;
> +  using std::wofstream;
> +}
> +
> +// <functional>
> +export namespace std
> +{
> +  using std::bind;
> +  using std::bind_front;
> +  using std::bit_and;
> +  using std::bit_not;
> +  using std::bit_or;
> +  using std::bit_xor;
> +  using std::compare_three_way;
> +  using std::cref;
> +  using std::divides;
> +  using std::equal_to;
> +  using std::greater;
> +  using std::greater_equal;
> +  using std::identity;
> +  using std::invoke;
> +  using std::is_bind_expression;
> +  using std::is_bind_expression_v;
> +  using std::is_placeholder;
> +  using std::is_placeholder_v;
> +  using std::less;
> +  using std::less_equal;
> +  using std::logical_and;
> +  using std::logical_not;
> +  using std::logical_or;
> +  using std::minus;
> +  using std::modulus;
> +  using std::multiplies;
> +  using std::negate;
> +  using std::not_equal_to;
> +  using std::not_fn;
> +  using std::plus;
> +  using std::ref;
> +  using std::reference_wrapper;
> +  namespace placeholders
> +  {
> +    using std::placeholders::_1;
> +    using std::placeholders::_10;
> +    using std::placeholders::_2;
> +    using std::placeholders::_3;
> +    using std::placeholders::_4;
> +    using std::placeholders::_5;
> +    using std::placeholders::_6;
> +    using std::placeholders::_7;
> +    using std::placeholders::_8;
> +    using std::placeholders::_9;
> +  }
> +  using std::bad_function_call;
> +  using std::function;
> +  using std::mem_fn;
> +  using std::swap;
> +  using std::operator==;
> +  using std::boyer_moore_horspool_searcher;
> +  using std::boyer_moore_searcher;
> +  using std::default_searcher;
> +  using std::hash;
> +  namespace ranges
> +  {
> +    using std::ranges::equal_to;
> +    using std::ranges::greater;
> +    using std::ranges::greater_equal;
> +    using std::ranges::less;
> +    using std::ranges::less_equal;
> +    using std::ranges::not_equal_to;
> +  }
> +}
> +
> +// <future>
> +export namespace std
> +{
> +  using std::future_errc;
> +  using std::future_status;
> +  using std::launch;
> +  using std::operator&;
> +  using std::operator&=;
> +  using std::operator^;
> +  using std::operator^=;
> +  using std::operator|;
> +  using std::operator|=;
> +  using std::operator~;
> +  using std::async;
> +  using std::future;
> +  using std::future_category;
> +  using std::future_error;
> +  using std::is_error_code_enum;
> +  using std::make_error_code;
> +  using std::make_error_condition;
> +  using std::packaged_task;
> +  using std::promise;
> +  using std::shared_future;
> +  using std::swap;
> +  using std::uses_allocator;
> +}
> +
> +// <generator> FIXME
> +
> +// <hazard_pointer> FIXME
> +
> +// 17.10.2 <initializer_list>
> +export namespace std
> +{
> +  using std::begin;
> +  using std::end;
> +  using std::initializer_list;
> +}
> +
> +// <inplace_vector> FIXME
> +
> +// <iomanip>
> +export namespace std
> +{
> +  using std::get_money;
> +  using std::get_time;
> +  using std::put_money;
> +  using std::put_time;
> +  using std::quoted;
> +  using std::resetiosflags;
> +  using std::setbase;
> +  using std::setfill;
> +  using std::setiosflags;
> +  using std::setprecision;
> +  using std::setw;
> +}
> +
> +// <ios>
> +export namespace std
> +{
> +  using std::fpos;
> +  using std::operator!=;
> +  using std::operator-;
> +  using std::operator==;
> +  using std::basic_ios;
> +  using std::boolalpha;
> +  using std::dec;
> +  using std::defaultfloat;
> +  using std::fixed;
> +  using std::hex;
> +  using std::hexfloat;
> +  using std::internal;
> +  using std::io_errc;
> +  using std::ios;
> +  using std::ios_base;
> +  using std::iostream_category;
> +  using std::is_error_code_enum;
> +  using std::left;
> +  using std::make_error_code;
> +  using std::make_error_condition;
> +  using std::noboolalpha;
> +  using std::noshowbase;
> +  using std::noshowpoint;
> +  using std::noshowpos;
> +  using std::noskipws;
> +  using std::nounitbuf;
> +  using std::nouppercase;
> +  using std::oct;
> +  using std::right;
> +  using std::scientific;
> +  using std::showbase;
> +  using std::showpoint;
> +  using std::showpos;
> +  using std::skipws;
> +  using std::streamoff;
> +  using std::streamsize;
> +  using std::unitbuf;
> +  using std::uppercase;
> +  using std::wios;
> +}
> +
> +// <iosfwd>
> +export namespace std
> +{
> +  using std::streampos;
> +  using std::u16streampos;
> +  using std::u32streampos;
> +  using std::u8streampos;
> +  using std::wstreampos;
> +  using std::basic_osyncstream;
> +  using std::basic_syncbuf;
> +  using std::istreambuf_iterator;
> +  using std::ostreambuf_iterator;
> +  using std::osyncstream;
> +  using std::syncbuf;
> +  using std::wosyncstream;
> +  using std::wsyncbuf;
> +  using std::fpos;
> +}
> +
> +// <iostream>
> +export namespace std
> +{
> +  using std::cerr;
> +  using std::cin;
> +  using std::clog;
> +  using std::cout;
> +  using std::wcerr;
> +  using std::wcin;
> +  using std::wclog;
> +  using std::wcout;
> +}
> +
> +// <istream>
> +export namespace std
> +{
> +  using std::basic_iostream;
> +  using std::basic_istream;
> +  using std::iostream;
> +  using std::istream;
> +  using std::wiostream;
> +  using std::wistream;
> +  using std::ws;
> +  using std::operator>>;
> +}
> +
> +// <iterator>
> +export namespace std
> +{
> +  using std::incrementable_traits;
> +  using std::indirectly_readable_traits;
> +  using std::iter_difference_t;
> +  using std::iter_reference_t;
> +  using std::iter_value_t;
> +  using std::iterator_traits;
> +  namespace ranges
> +  {
> +    using std::ranges::iter_move;
> +    using std::ranges::iter_swap;
> +  }
> +  using std::advance;
> +  using std::bidirectional_iterator;
> +  using std::bidirectional_iterator_tag;
> +  using std::contiguous_iterator;
> +  using std::contiguous_iterator_tag;
> +  using std::disable_sized_sentinel_for;
> +  using std::distance;
> +  using std::forward_iterator;
> +  using std::forward_iterator_tag;
> +  using std::incrementable;
> +  using std::indirect_binary_predicate;
> +  using std::indirect_equivalence_relation;
> +  using std::indirect_result_t;
> +  using std::indirect_strict_weak_order;
> +  using std::indirect_unary_predicate;
> +  using std::indirectly_comparable;
> +  using std::indirectly_copyable;
> +  using std::indirectly_copyable_storable;
> +  using std::indirectly_movable;
> +  using std::indirectly_movable_storable;
> +  using std::indirectly_readable;
> +  using std::indirectly_regular_unary_invocable;
> +  using std::indirectly_swappable;
> +  using std::indirectly_unary_invocable;
> +  using std::indirectly_writable;
> +  using std::input_iterator;
> +  using std::input_iterator_tag;
> +  using std::input_or_output_iterator;
> +  using std::iter_common_reference_t;
> +  using std::iter_rvalue_reference_t;
> +  using std::mergeable;
> +  using std::next;
> +  using std::output_iterator;
> +  using std::output_iterator_tag;
> +  using std::permutable;
> +  using std::prev;
> +  using std::projected;
> +  using std::random_access_iterator;
> +  using std::random_access_iterator_tag;
> +  using std::sentinel_for;
> +  using std::sized_sentinel_for;
> +  using std::sortable;
> +  using std::weakly_incrementable;
> +  namespace ranges
> +  {
> +    using std::ranges::advance;
> +    using std::ranges::distance;
> +    using std::ranges::next;
> +    using std::ranges::prev;
> +  }
> +  using std::reverse_iterator;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::operator-;
> +  using std::operator+;
> +  using std::back_insert_iterator;
> +  using std::back_inserter;
> +  using std::begin;
> +  using std::cbegin;
> +  using std::cend;
> +  using std::common_iterator;
> +  using std::counted_iterator;
> +  using std::crbegin;
> +  using std::crend;
> +  using std::data;
> +  using std::default_sentinel;
> +  using std::default_sentinel_t;
> +  using std::empty;
> +  using std::end;
> +  using std::front_insert_iterator;
> +  using std::front_inserter;
> +  using std::insert_iterator;
> +  using std::inserter;
> +  using std::istream_iterator;
> +  using std::istreambuf_iterator;
> +  using std::iterator;
> +  using std::make_move_iterator;
> +  using std::make_reverse_iterator;
> +  using std::move_iterator;
> +  using std::move_sentinel;
> +  using std::ostream_iterator;
> +  using std::ostreambuf_iterator;
> +  using std::rbegin;
> +  using std::rend;
> +  using std::size;
> +  using std::ssize;
> +  using std::unreachable_sentinel;
> +  using std::unreachable_sentinel_t;
> +}
> +
> +// <latch>
> +export namespace std
> +{
> +  using std::latch;
> +}
> +
> +// 17.3.3 <limits> [limits.syn]
> +export namespace std
> +{
> +  using std::float_denorm_style; // deprecated in C++23
> +  using std::float_round_style;
> +  using std::numeric_limits;
> +}
> +
> +// FIXME <linalg>
> +
> +// <list>
> +export namespace std
> +{
> +  using std::list;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::list;
> +  }
> +}
> +
> +// <locale>
> +export namespace std
> +{
> +  using std::codecvt;
> +  using std::codecvt_base;
> +  using std::codecvt_byname;
> +  using std::collate;
> +  using std::collate_byname;
> +  using std::ctype;
> +  using std::ctype_base;
> +  using std::ctype_byname;
> +  using std::has_facet;
> +  using std::isalnum;
> +  using std::isalpha;
> +  using std::isblank;
> +  using std::iscntrl;
> +  using std::isdigit;
> +  using std::isgraph;
> +  using std::islower;
> +  using std::isprint;
> +  using std::ispunct;
> +  using std::isspace;
> +  using std::isupper;
> +  using std::isxdigit;
> +  using std::locale;
> +  using std::messages;
> +  using std::messages_base;
> +  using std::messages_byname;
> +  using std::money_base;
> +  using std::money_get;
> +  using std::money_put;
> +  using std::moneypunct;
> +  using std::moneypunct_byname;
> +  using std::num_get;
> +  using std::num_put;
> +  using std::numpunct;
> +  using std::numpunct_byname;
> +  using std::time_base;
> +  using std::time_get;
> +  using std::time_get_byname;
> +  using std::time_put;
> +  using std::time_put_byname;
> +  using std::tolower;
> +  using std::toupper;
> +  using std::use_facet;
> +  using std::wbuffer_convert;
> +  using std::wstring_convert;
> +}
> +
> +// <map>
> +export namespace std
> +{
> +  using std::map;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase_if;
> +  using std::multimap;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::map;
> +    using std::pmr::multimap;
> +  }
> +}
> +
> +// FIXME <mdspan>
> +
> +// 20.2 <memory>
> +export namespace std
> +{
> +  using std::align;
> +  using std::allocator;
> +  using std::allocator_arg;
> +  using std::allocator_arg_t;
> +  using std::allocator_traits;
> +  using std::assume_aligned;
> +  using std::make_obj_using_allocator;
> +  using std::pointer_traits;
> +  using std::to_address;
> +  using std::uninitialized_construct_using_allocator;
> +  using std::uses_allocator;
> +  using std::uses_allocator_construction_args;
> +  using std::uses_allocator_v;
> +  using std::operator==;
> +  using std::addressof;
> +  using std::uninitialized_default_construct;
> +  using std::uninitialized_default_construct_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_default_construct;
> +    using std::ranges::uninitialized_default_construct_n;
> +  }
> +  using std::uninitialized_value_construct;
> +  using std::uninitialized_value_construct_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_value_construct;
> +    using std::ranges::uninitialized_value_construct_n;
> +  }
> +  using std::uninitialized_copy;
> +  using std::uninitialized_copy_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_copy;
> +    using std::ranges::uninitialized_copy_n;
> +    using std::ranges::uninitialized_copy_n_result;
> +    using std::ranges::uninitialized_copy_result;
> +  }
> +  using std::uninitialized_move;
> +  using std::uninitialized_move_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_move;
> +    using std::ranges::uninitialized_move_n;
> +    using std::ranges::uninitialized_move_n_result;
> +    using std::ranges::uninitialized_move_result;
> +  }
> +  using std::uninitialized_fill;
> +  using std::uninitialized_fill_n;
> +  namespace ranges
> +  {
> +    using std::ranges::uninitialized_fill;
> +    using std::ranges::uninitialized_fill_n;
> +  }
> +  using std::construct_at;
> +  namespace ranges
> +  {
> +    using std::ranges::construct_at;
> +  }
> +  using std::destroy;
> +  using std::destroy_at;
> +  using std::destroy_n;
> +  namespace ranges
> +  {
> +    using std::ranges::destroy;
> +    using std::ranges::destroy_at;
> +    using std::ranges::destroy_n;
> +  }
> +  using std::default_delete;
> +  using std::make_unique;
> +  using std::make_unique_for_overwrite;
> +  using std::unique_ptr;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::allocate_shared;
> +  using std::allocate_shared_for_overwrite;
> +  using std::bad_weak_ptr;
> +  using std::const_pointer_cast;
> +  using std::dynamic_pointer_cast;
> +  using std::make_shared;
> +  using std::make_shared_for_overwrite;
> +  using std::reinterpret_pointer_cast;
> +  using std::shared_ptr;
> +  using std::static_pointer_cast;
> +  using std::swap;
> +  using std::get_deleter;
> +  using std::atomic_compare_exchange_strong;
> +  using std::atomic_compare_exchange_strong_explicit;
> +  using std::atomic_compare_exchange_weak;
> +  using std::atomic_compare_exchange_weak_explicit;
> +  using std::atomic_exchange;
> +  using std::atomic_exchange_explicit;
> +  using std::atomic_is_lock_free;
> +  using std::atomic_load;
> +  using std::atomic_load_explicit;
> +  using std::atomic_store;
> +  using std::atomic_store_explicit;
> +  using std::enable_shared_from_this;
> +  using std::hash;
> +  using std::owner_less;
> +  using std::weak_ptr;
> +}
> +
> +// 20.4 <memory_resource>
> +export namespace std::pmr
> +{
> +  using std::pmr::memory_resource;
> +  using std::pmr::operator==;
> +  using std::pmr::get_default_resource;
> +  using std::pmr::monotonic_buffer_resource;
> +  using std::pmr::new_delete_resource;
> +  using std::pmr::null_memory_resource;
> +  using std::pmr::polymorphic_allocator;
> +  using std::pmr::pool_options;
> +  using std::pmr::set_default_resource;
> +  using std::pmr::synchronized_pool_resource;
> +  using std::pmr::unsynchronized_pool_resource;
> +}
> +
> +// <mutex>
> +export namespace std
> +{
> +  using std::adopt_lock;
> +  using std::adopt_lock_t;
> +  using std::call_once;
> +  using std::defer_lock;
> +  using std::defer_lock_t;
> +  using std::lock;
> +  using std::lock_guard;
> +  using std::mutex;
> +  using std::once_flag;
> +  using std::recursive_mutex;
> +  using std::recursive_timed_mutex;
> +  using std::scoped_lock;
> +  using std::swap;
> +  using std::timed_mutex;
> +  using std::try_lock;
> +  using std::try_to_lock;
> +  using std::try_to_lock_t;
> +  using std::unique_lock;
> +}
> +
> +// 17.6.2 <new> [new.syn]
> +export namespace std
> +{
> +  using std::align_val_t;
> +  using std::bad_alloc;
> +  using std::bad_array_new_length;
> +  using std::destroying_delete;
> +  using std::destroying_delete_t;
> +  using std::get_new_handler;
> +  using std::hardware_destructive_interference_size;
> +  using std::hardware_constructive_interference_size;
> +  using std::launder;
> +  using std::new_handler;
> +  using std::nothrow;
> +  using std::nothrow_t;
> +  using std::set_new_handler;
> +}
> +export
> +{
> +  using ::operator new;
> +  using ::operator delete;
> +  using ::operator new[];
> +  using ::operator delete[];
> +}
> +
> +// <numbers>
> +export namespace std::numbers
> +{
> +  using std::numbers::e;
> +  using std::numbers::e_v;
> +  using std::numbers::egamma;
> +  using std::numbers::egamma_v;
> +  using std::numbers::inv_pi;
> +  using std::numbers::inv_pi_v;
> +  using std::numbers::inv_sqrt3;
> +  using std::numbers::inv_sqrt3_v;
> +  using std::numbers::inv_sqrtpi;
> +  using std::numbers::inv_sqrtpi_v;
> +  using std::numbers::ln10;
> +  using std::numbers::ln10_v;
> +  using std::numbers::ln2;
> +  using std::numbers::ln2_v;
> +  using std::numbers::log10e;
> +  using std::numbers::log10e_v;
> +  using std::numbers::log2e;
> +  using std::numbers::log2e_v;
> +  using std::numbers::phi;
> +  using std::numbers::phi_v;
> +  using std::numbers::pi;
> +  using std::numbers::pi_v;
> +  using std::numbers::sqrt2;
> +  using std::numbers::sqrt2_v;
> +  using std::numbers::sqrt3;
> +  using std::numbers::sqrt3_v;
> +}
> +
> +// <numeric>
> +export namespace std
> +{
> +  using std::accumulate;
> +  using std::adjacent_difference;
> +  using std::exclusive_scan;
> +  using std::inclusive_scan;
> +  using std::inner_product;
> +  using std::iota;
> +  using std::partial_sum;
> +  using std::reduce;
> +  using std::transform_exclusive_scan;
> +  using std::transform_inclusive_scan;
> +  using std::transform_reduce;
> +  using std::gcd;
> +  using std::lcm;
> +  using std::midpoint;
> +}
> +
> +// <optional>
> +export namespace std
> +{
> +  using std::bad_optional_access;
> +  using std::nullopt;
> +  using std::nullopt_t;
> +  using std::optional;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::hash;
> +  using std::make_optional;
> +  using std::swap;
> +}
> +
> +// <ostream>
> +export namespace std
> +{
> +  using std::basic_ostream;
> +  using std::endl;
> +  using std::ends;
> +  using std::flush;
> +  using std::ostream;
> +  using std::wostream;
> +  using std::operator<<;
> +}
> +
> +// FIXME <print>
> +
> +// <queue>
> +export namespace std
> +{
> +  using std::queue;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::priority_queue;
> +  using std::swap;
> +  using std::uses_allocator;
> +}
> +
> +// <random>
> +export namespace std
> +{
> +  using std::bernoulli_distribution;
> +  using std::binomial_distribution;
> +  using std::cauchy_distribution;
> +  using std::chi_squared_distribution;
> +  using std::default_random_engine;
> +  using std::discard_block_engine;
> +  using std::discrete_distribution;
> +  using std::exponential_distribution;
> +  using std::extreme_value_distribution;
> +  using std::fisher_f_distribution;
> +  using std::gamma_distribution;
> +  using std::generate_canonical;
> +  using std::geometric_distribution;
> +  using std::independent_bits_engine;
> +  using std::knuth_b;
> +  using std::linear_congruential_engine;
> +  using std::lognormal_distribution;
> +  using std::mersenne_twister_engine;
> +  using std::minstd_rand;
> +  using std::minstd_rand0;
> +  using std::mt19937;
> +  using std::mt19937_64;
> +  using std::negative_binomial_distribution;
> +  using std::normal_distribution;
> +  using std::piecewise_constant_distribution;
> +  using std::piecewise_linear_distribution;
> +  using std::poisson_distribution;
> +  using std::random_device;
> +  using std::ranlux24;
> +  using std::ranlux24_base;
> +  using std::ranlux48;
> +  using std::ranlux48_base;
> +  using std::seed_seq;
> +  using std::shuffle_order_engine;
> +  using std::student_t_distribution;
> +  using std::subtract_with_carry_engine;
> +  using std::uniform_int_distribution;
> +  using std::uniform_random_bit_generator;
> +  using std::uniform_real_distribution;
> +  using std::weibull_distribution;
> +}
> +
> +// <ranges>
> +export namespace std
> +{
> +  namespace ranges
> +  {
> +    using std::ranges::begin;
> +    using std::ranges::cbegin;
> +    using std::ranges::cdata;
> +    using std::ranges::cend;
> +    using std::ranges::crbegin;
> +    using std::ranges::crend;
> +    using std::ranges::data;
> +    using std::ranges::empty;
> +    using std::ranges::end;
> +    using std::ranges::rbegin;
> +    using std::ranges::rend;
> +    using std::ranges::size;
> +    using std::ranges::ssize;
> +    using std::ranges::bidirectional_range;
> +    using std::ranges::borrowed_range;
> +    using std::ranges::common_range;
> +    using std::ranges::contiguous_range;
> +    using std::ranges::disable_sized_range;
> +    using std::ranges::enable_borrowed_range;
> +    using std::ranges::enable_view;
> +    using std::ranges::forward_range;
> +    using std::ranges::get;
> +    using std::ranges::input_range;
> +    using std::ranges::iterator_t;
> +    using std::ranges::output_range;
> +    using std::ranges::random_access_range;
> +    using std::ranges::range;
> +    using std::ranges::range_common_reference_t;
> +    using std::ranges::range_difference_t;
> +    using std::ranges::range_reference_t;
> +    using std::ranges::range_rvalue_reference_t;
> +    using std::ranges::range_size_t;
> +    using std::ranges::range_value_t;
> +    using std::ranges::sentinel_t;
> +    using std::ranges::sized_range;
> +    using std::ranges::subrange;
> +    using std::ranges::subrange_kind;
> +    using std::ranges::view;
> +    using std::ranges::view_base;
> +    using std::ranges::view_interface;
> +    using std::ranges::viewable_range;
> +  }
> +  using std::ranges::get;
> +  namespace ranges
> +  {
> +    using std::ranges::borrowed_iterator_t;
> +    using std::ranges::borrowed_subrange_t;
> +    using std::ranges::dangling;
> +    using std::ranges::empty_view;
> +    namespace views
> +    {
> +      using std::ranges::views::empty;
> +    }
> +    using std::ranges::single_view;
> +    namespace views
> +    {
> +      using std::ranges::views::single;
> +    }
> +    using std::ranges::iota_view;
> +    namespace views
> +    {
> +      using std::ranges::views::iota;
> +    }
> +    using std::ranges::basic_istream_view;
> +    using std::ranges::istream_view;
> +    using std::ranges::wistream_view;
> +    namespace views
> +    {
> +      using std::ranges::views::istream;
> +    }
> +    namespace views
> +    {
> +      using std::ranges::views::all;
> +      using std::ranges::views::all_t;
> +    }
> +    using std::ranges::filter_view;
> +    using std::ranges::owning_view;
> +    using std::ranges::ref_view;
> +    namespace views
> +    {
> +      using std::ranges::views::filter;
> +    }
> +    using std::ranges::transform_view;
> +    namespace views
> +    {
> +      using std::ranges::views::transform;
> +    }
> +    using std::ranges::take_view;
> +    namespace views
> +    {
> +      using std::ranges::views::take;
> +    }
> +    using std::ranges::take_while_view;
> +    namespace views
> +    {
> +      using std::ranges::views::take_while;
> +    }
> +    using std::ranges::drop_view;
> +    namespace views
> +    {
> +      using std::ranges::views::drop;
> +    }
> +    using std::ranges::drop_while_view;
> +    namespace views
> +    {
> +      using std::ranges::views::drop_while;
> +    }
> +    using std::ranges::join_view;
> +    namespace views
> +    {
> +      using std::ranges::views::join;
> +    }
> +    using std::ranges::lazy_split_view;
> +    using std::ranges::split_view;
> +    namespace views
> +    {
> +      using std::ranges::views::lazy_split;
> +      using std::ranges::views::split;
> +    }
> +    namespace views
> +    {
> +      using std::ranges::views::counted;
> +    }
> +    using std::ranges::common_view;
> +    namespace views
> +    {
> +      using std::ranges::views::common;
> +    }
> +    using std::ranges::reverse_view;
> +    namespace views
> +    {
> +      using std::ranges::views::reverse;
> +    }
> +    using std::ranges::elements_view;
> +    using std::ranges::keys_view;
> +    using std::ranges::values_view;
> +    namespace views
> +    {
> +      using std::ranges::views::elements;
> +      using std::ranges::views::keys;
> +      using std::ranges::views::values;
> +    }
> +  }
> +  namespace views = ranges::views;
> +  using std::tuple_element;
> +  using std::tuple_size;
> +}
> +
> +// <ratio>
> +export namespace std
> +{
> +  using std::atto;
> +  using std::centi;
> +  using std::deca;
> +  using std::deci;
> +  using std::exa;
> +  using std::femto;
> +  using std::giga;
> +  using std::hecto;
> +  using std::kilo;
> +  using std::mega;
> +  using std::micro;
> +  using std::milli;
> +  using std::nano;
> +  using std::peta;
> +  using std::pico;
> +  using std::ratio;
> +  using std::ratio_add;
> +  using std::ratio_divide;
> +  using std::ratio_equal;
> +  using std::ratio_equal_v;
> +  using std::ratio_greater;
> +  using std::ratio_greater_equal;
> +  using std::ratio_greater_equal_v;
> +  using std::ratio_greater_v;
> +  using std::ratio_less;
> +  using std::ratio_less_equal;
> +  using std::ratio_less_equal_v;
> +  using std::ratio_less_v;
> +  using std::ratio_multiply;
> +  using std::ratio_not_equal;
> +  using std::ratio_not_equal_v;
> +  using std::ratio_subtract;
> +  using std::tera;
> +}
> +
> +// FIXME <rcu>
> +
> +// <regex>
> +export namespace std
> +{
> +  namespace regex_constants
> +  {
> +    using std::regex_constants::error_type;
> +    using std::regex_constants::match_flag_type;
> +    using std::regex_constants::syntax_option_type;
> +    using std::regex_constants::operator&;
> +    using std::regex_constants::operator&=;
> +    using std::regex_constants::operator^;
> +    using std::regex_constants::operator^=;
> +    using std::regex_constants::operator|;
> +    using std::regex_constants::operator|=;
> +    using std::regex_constants::operator~;
> +  }
> +  using std::basic_regex;
> +  using std::csub_match;
> +  using std::regex;
> +  using std::regex_error;
> +  using std::regex_traits;
> +  using std::ssub_match;
> +  using std::sub_match;
> +  using std::swap;
> +  using std::wcsub_match;
> +  using std::wregex;
> +  using std::wssub_match;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::cmatch;
> +  using std::cregex_iterator;
> +  using std::cregex_token_iterator;
> +  using std::match_results;
> +  using std::regex_iterator;
> +  using std::regex_match;
> +  using std::regex_replace;
> +  using std::regex_search;
> +  using std::regex_token_iterator;
> +  using std::smatch;
> +  using std::sregex_iterator;
> +  using std::sregex_token_iterator;
> +  using std::wcmatch;
> +  using std::wcregex_iterator;
> +  using std::wcregex_token_iterator;
> +  using std::wsmatch;
> +  using std::wsregex_iterator;
> +  using std::wsregex_token_iterator;
> +  namespace pmr
> +  {
> +    using std::pmr::cmatch;
> +    using std::pmr::match_results;
> +    using std::pmr::smatch;
> +    using std::pmr::wcmatch;
> +    using std::pmr::wsmatch;
> +  }
> +}
> +
> +// 20.5 <scoped_allocator>
> +export namespace std
> +{
> +  using std::scoped_allocator_adaptor;
> +  using std::operator==;
> +}
> +
> +// <semaphore>
> +export namespace std
> +{
> +  using std::binary_semaphore;
> +  using std::counting_semaphore;
> +}
> +
> +// <set>
> +export namespace std
> +{
> +  using std::set;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase_if;
> +  using std::multiset;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::multiset;
> +    using std::pmr::set;
> +  }
> +}
> +
> +// <shared_mutex>
> +export namespace std
> +{
> +  using std::shared_lock;
> +  using std::shared_mutex;
> +  using std::shared_timed_mutex;
> +  using std::swap;
> +}
> +
> +// 17.8.1 <source_location>
> +export namespace std
> +{
> +  using std::source_location;
> +}
> +
> +// <span>
> +export namespace std
> +{
> +  using std::dynamic_extent;
> +  using std::span;
> +  namespace ranges
> +  {
> +    using std::ranges::enable_borrowed_range;
> +    using std::ranges::enable_view;
> +  }
> +  using std::as_bytes;
> +  using std::as_writable_bytes;
> +}
> +
> +// <sstream>
> +export namespace std
> +{
> +  using std::basic_istringstream;
> +  using std::basic_ostringstream;
> +  using std::basic_stringbuf;
> +  using std::basic_stringstream;
> +  using std::istringstream;
> +  using std::ostringstream;
> +  using std::stringbuf;
> +  using std::stringstream;
> +  using std::swap;
> +  using std::wistringstream;
> +  using std::wostringstream;
> +  using std::wstringbuf;
> +  using std::wstringstream;
> +}
> +
> +// <stack>
> +export namespace std
> +{
> +  using std::stack;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::swap;
> +  using std::uses_allocator;
> +}
> +
> +// 19.6 <stacktrace>
> +export namespace std
> +{
> +  using std::stacktrace_entry;
> +  using std::basic_stacktrace;
> +  using std::stacktrace;
> +  using std::swap;
> +  using std::to_string;
> +  using std::operator<<;
> +  using std::formatter;
> +  namespace pmr
> +  {
> +    using std::pmr::stacktrace;
> +  }
> +  using std::hash;
> +}
> +
> +// 19.2 <stdexcept>
> +export namespace std
> +{
> +  using std::domain_error;
> +  using std::invalid_argument;
> +  using std::length_error;
> +  using std::logic_error;
> +  using std::out_of_range;
> +  using std::overflow_error;
> +  using std::range_error;
> +  using std::runtime_error;
> +  using std::underflow_error;
> +}
> +
> +// 17.4.2 <stdfloat>
> +export namespace std
> +{
> +#ifdef __STDCPP_FLOAT16_T__
> +  using std::float16_t;
> +#endif
> +#ifdef __STDCPP_FLOAT32_T__
> +  using std::float32_t;
> +#endif
> +#ifdef __STDCPP_FLOAT64_T__
> +  using std::float64_t;
> +#endif
> +#ifdef __STDCPP_FLOAT128_T__
> +  using std::float128_t;
> +#endif
> +#ifdef __STDCPP_BFLOAT16_T__
> +  using std::bfloat16_t;
> +#endif
> +}
> +
> +// FIXME <stop_token>
> +
> +// <streambuf>
> +export namespace std
> +{
> +  using std::basic_streambuf;
> +  using std::streambuf;
> +  using std::wstreambuf;
> +}
> +
> +// <string>
> +export namespace std
> +{
> +  using std::basic_string;
> +  using std::char_traits;
> +  using std::operator+;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::swap;
> +  using std::operator>>;
> +  using std::operator<<;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::getline;
> +  using std::stod;
> +  using std::stof;
> +  using std::stoi;
> +  using std::stol;
> +  using std::stold;
> +  using std::stoll;
> +  using std::stoul;
> +  using std::stoull;
> +  using std::string;
> +  using std::to_string;
> +  using std::to_wstring;
> +  using std::u16string;
> +  using std::u32string;
> +  using std::u8string;
> +  using std::wstring;
> +  namespace pmr
> +  {
> +    using std::pmr::basic_string;
> +    using std::pmr::string;
> +    using std::pmr::u16string;
> +    using std::pmr::u32string;
> +    using std::pmr::u8string;
> +    using std::pmr::wstring;
> +  }
> +  using std::hash;
> +  using std::operator""s;
> +}
> +
> +// <string_view>
> +export namespace std
> +{
> +  using std::basic_string_view;
> +  namespace ranges
> +  {
> +    using std::ranges::enable_borrowed_range;
> +    using std::ranges::enable_view;
> +  }
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::hash;
> +  using std::string_view;
> +  using std::u16string_view;
> +  using std::u32string_view;
> +  using std::u8string_view;
> +  using std::wstring_view;
> +  using std::operator""sv;
> +}
> +
> +// <strstream>: deprecated C++98, removed C++26
> +export namespace std
> +{
> +  using std::istrstream;
> +  using std::ostrstream;
> +  using std::strstream;
> +  using std::strstreambuf;
> +}
> +
> +// <syncstream>
> +export namespace std
> +{
> +  using std::basic_syncbuf;
> +  using std::swap;
> +  using std::basic_osyncstream;
> +  using std::osyncstream;
> +  using std::syncbuf;
> +  using std::wosyncstream;
> +  using std::wsyncbuf;
> +}
> +
> +// 19.5 <system_error>
> +export namespace std
> +{
> +  using std::errc;
> +  using std::error_category;
> +  using std::error_code;
> +  using std::error_condition;
> +  using std::generic_category;
> +  using std::is_error_code_enum;
> +  using std::is_error_condition_enum;
> +  using std::make_error_code;
> +  using std::system_category;
> +  using std::system_error;
> +  using std::operator<<;
> +  using std::make_error_condition;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::hash;
> +  using std::is_error_code_enum_v;
> +  using std::is_error_condition_enum_v;
> +}
> +
> +// FIXME <text_encoding>
> +
> +// <thread>
> +export namespace std
> +{
> +  using std::swap;
> +  using std::thread;
> +  using std::jthread;
> +  namespace this_thread
> +  {
> +    using std::this_thread::get_id;
> +    using std::this_thread::sleep_for;
> +    using std::this_thread::sleep_until;
> +    using std::this_thread::yield;
> +  }
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::operator<<;
> +  using std::hash;
> +}
> +
> +// <tuple>
> +export namespace std
> +{
> +  using std::apply;
> +  using std::forward_as_tuple;
> +  using std::get;
> +  using std::ignore;
> +  using std::make_from_tuple;
> +  using std::make_tuple;
> +  using std::tie;
> +  using std::tuple;
> +  using std::tuple_cat;
> +  using std::tuple_element;
> +  using std::tuple_element_t;
> +  using std::tuple_size;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::swap;
> +  using std::tuple_size_v;
> +  using std::uses_allocator;
> +}
> +
> +// <type_traits>
> +export namespace std
> +{
> +  using std::add_const;
> +  using std::add_const_t;
> +  using std::add_cv;
> +  using std::add_cv_t;
> +  using std::add_lvalue_reference;
> +  using std::add_lvalue_reference_t;
> +  using std::add_pointer;
> +  using std::add_pointer_t;
> +  using std::add_rvalue_reference;
> +  using std::add_rvalue_reference_t;
> +  using std::add_volatile;
> +  using std::add_volatile_t;
> +  using std::aligned_storage;
> +  using std::aligned_storage_t;
> +  using std::aligned_union;
> +  using std::aligned_union_t;
> +  using std::alignment_of;
> +  using std::alignment_of_v;
> +  using std::basic_common_reference;
> +  using std::bool_constant;
> +  using std::common_reference;
> +  using std::common_reference_t;
> +  using std::common_type;
> +  using std::common_type_t;
> +  using std::conditional;
> +  using std::conditional_t;
> +  using std::conjunction;
> +  using std::conjunction_v;
> +  using std::decay;
> +  using std::decay_t;
> +  using std::disjunction;
> +  using std::disjunction_v;
> +  using std::enable_if;
> +  using std::enable_if_t;
> +  using std::extent;
> +  using std::extent_v;
> +  using std::false_type;
> +  using std::has_unique_object_representations;
> +  using std::has_unique_object_representations_v;
> +  using std::has_virtual_destructor;
> +  using std::has_virtual_destructor_v;
> +  using std::integral_constant;
> +  using std::invoke_result;
> +  using std::invoke_result_t;
> +  using std::is_abstract;
> +  using std::is_abstract_v;
> +  using std::is_aggregate;
> +  using std::is_aggregate_v;
> +  using std::is_arithmetic;
> +  using std::is_arithmetic_v;
> +  using std::is_array;
> +  using std::is_array_v;
> +  using std::is_assignable;
> +  using std::is_assignable_v;
> +  using std::is_base_of;
> +  using std::is_base_of_v;
> +  using std::is_bounded_array;
> +  using std::is_bounded_array_v;
> +  using std::is_class;
> +  using std::is_class_v;
> +  using std::is_compound;
> +  using std::is_compound_v;
> +  using std::is_const;
> +  using std::is_const_v;
> +  using std::is_constant_evaluated;
> +  using std::is_constructible;
> +  using std::is_constructible_v;
> +  using std::is_convertible;
> +  using std::is_convertible_v;
> +  using std::is_copy_assignable;
> +  using std::is_copy_assignable_v;
> +  using std::is_copy_constructible;
> +  using std::is_copy_constructible_v;
> +  using std::is_default_constructible;
> +  using std::is_default_constructible_v;
> +  using std::is_destructible;
> +  using std::is_destructible_v;
> +  using std::is_empty;
> +  using std::is_empty_v;
> +  using std::is_enum;
> +  using std::is_enum_v;
> +  using std::is_final;
> +  using std::is_final_v;
> +  using std::is_floating_point;
> +  using std::is_floating_point_v;
> +  using std::is_function;
> +  using std::is_function_v;
> +  using std::is_fundamental;
> +  using std::is_fundamental_v;
> +  using std::is_integral;
> +  using std::is_integral_v;
> +  using std::is_invocable;
> +  using std::is_invocable_r;
> +  using std::is_invocable_r_v;
> +  using std::is_invocable_v;
> +  using std::is_lvalue_reference;
> +  using std::is_lvalue_reference_v;
> +  using std::is_member_function_pointer;
> +  using std::is_member_function_pointer_v;
> +  using std::is_member_object_pointer;
> +  using std::is_member_object_pointer_v;
> +  using std::is_member_pointer;
> +  using std::is_member_pointer_v;
> +  using std::is_move_assignable;
> +  using std::is_move_assignable_v;
> +  using std::is_move_constructible;
> +  using std::is_move_constructible_v;
> +  using std::is_nothrow_assignable;
> +  using std::is_nothrow_assignable_v;
> +  using std::is_nothrow_constructible;
> +  using std::is_nothrow_constructible_v;
> +  using std::is_nothrow_convertible;
> +  using std::is_nothrow_convertible_v;
> +  using std::is_nothrow_copy_assignable;
> +  using std::is_nothrow_copy_assignable_v;
> +  using std::is_nothrow_copy_constructible;
> +  using std::is_nothrow_copy_constructible_v;
> +  using std::is_nothrow_default_constructible;
> +  using std::is_nothrow_default_constructible_v;
> +  using std::is_nothrow_destructible;
> +  using std::is_nothrow_destructible_v;
> +  using std::is_nothrow_invocable;
> +  using std::is_nothrow_invocable_r;
> +  using std::is_nothrow_invocable_r_v;
> +  using std::is_nothrow_invocable_v;
> +  using std::is_nothrow_move_assignable;
> +  using std::is_nothrow_move_assignable_v;
> +  using std::is_nothrow_move_constructible;
> +  using std::is_nothrow_move_constructible_v;
> +  using std::is_nothrow_swappable;
> +  using std::is_nothrow_swappable_v;
> +  using std::is_nothrow_swappable_with;
> +  using std::is_nothrow_swappable_with_v;
> +  using std::is_null_pointer;
> +  using std::is_null_pointer_v;
> +  using std::is_object;
> +  using std::is_object_v;
> +  using std::is_pod;
> +  using std::is_pod_v;
> +  using std::is_pointer;
> +  using std::is_pointer_v;
> +  using std::is_polymorphic;
> +  using std::is_polymorphic_v;
> +  using std::is_reference;
> +  using std::is_reference_v;
> +  using std::is_rvalue_reference;
> +  using std::is_rvalue_reference_v;
> +  using std::is_same;
> +  using std::is_same_v;
> +  using std::is_scalar;
> +  using std::is_scalar_v;
> +  using std::is_signed;
> +  using std::is_signed_v;
> +  using std::is_standard_layout;
> +  using std::is_standard_layout_v;
> +  using std::is_swappable;
> +  using std::is_swappable_v;
> +  using std::is_swappable_with;
> +  using std::is_swappable_with_v;
> +  using std::is_trivial;
> +  using std::is_trivial_v;
> +  using std::is_trivially_assignable;
> +  using std::is_trivially_assignable_v;
> +  using std::is_trivially_constructible;
> +  using std::is_trivially_constructible_v;
> +  using std::is_trivially_copy_assignable;
> +  using std::is_trivially_copy_assignable_v;
> +  using std::is_trivially_copy_constructible;
> +  using std::is_trivially_copy_constructible_v;
> +  using std::is_trivially_copyable;
> +  using std::is_trivially_copyable_v;
> +  using std::is_trivially_default_constructible;
> +  using std::is_trivially_default_constructible_v;
> +  using std::is_trivially_destructible;
> +  using std::is_trivially_destructible_v;
> +  using std::is_trivially_move_assignable;
> +  using std::is_trivially_move_assignable_v;
> +  using std::is_trivially_move_constructible;
> +  using std::is_trivially_move_constructible_v;
> +  using std::is_unbounded_array;
> +  using std::is_unbounded_array_v;
> +  using std::is_union;
> +  using std::is_union_v;
> +  using std::is_unsigned;
> +  using std::is_unsigned_v;
> +  using std::is_void;
> +  using std::is_void_v;
> +  using std::is_volatile;
> +  using std::is_volatile_v;
> +  using std::make_signed;
> +  using std::make_signed_t;
> +  using std::make_unsigned;
> +  using std::make_unsigned_t;
> +  using std::negation;
> +  using std::negation_v;
> +  using std::rank;
> +  using std::rank_v;
> +  using std::remove_all_extents;
> +  using std::remove_all_extents_t;
> +  using std::remove_const;
> +  using std::remove_const_t;
> +  using std::remove_cv;
> +  using std::remove_cv_t;
> +  using std::remove_cvref;
> +  using std::remove_cvref_t;
> +  using std::remove_extent;
> +  using std::remove_extent_t;
> +  using std::remove_pointer;
> +  using std::remove_pointer_t;
> +  using std::remove_reference;
> +  using std::remove_reference_t;
> +  using std::remove_volatile;
> +  using std::remove_volatile_t;
> +  using std::true_type;
> +  using std::type_identity;
> +  using std::type_identity_t;
> +  using std::underlying_type;
> +  using std::underlying_type_t;
> +  using std::unwrap_ref_decay;
> +  using std::unwrap_ref_decay_t;
> +  using std::unwrap_reference;
> +  using std::unwrap_reference_t;
> +  using std::void_t;
> +}
> +
> +// <typeindex>
> +export namespace std
> +{
> +  using std::hash;
> +  using std::type_index;
> +}
> +
> +// 17.7.2 <typeinfo> [typeinfo.syn]
> +export namespace std
> +{
> +  using std::bad_cast;
> +  using std::bad_typeid;
> +  using std::type_info;
> +}
> +
> +// <unordered_map>
> +export namespace std
> +{
> +  using std::unordered_map;
> +  using std::unordered_multimap;
> +  using std::operator==;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::unordered_map;
> +    using std::pmr::unordered_multimap;
> +  }
> +}
> +
> +// <unordered_set>
> +export namespace std
> +{
> +  using std::unordered_multiset;
> +  using std::unordered_set;
> +  using std::operator==;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::unordered_multiset;
> +    using std::pmr::unordered_set;
> +  }
> +}
> +
> +// <utility>
> +export namespace std
> +{
> +  using std::as_const;
> +  using std::cmp_equal;
> +  using std::cmp_greater;
> +  using std::cmp_greater_equal;
> +  using std::cmp_less;
> +  using std::cmp_less_equal;
> +  using std::cmp_not_equal;
> +  using std::declval;
> +  using std::exchange;
> +  using std::forward;
> +  using std::in_range;
> +  using std::index_sequence;
> +  using std::index_sequence_for;
> +  using std::integer_sequence;
> +  using std::make_index_sequence;
> +  using std::make_integer_sequence;
> +  using std::move;
> +  using std::move_if_noexcept;
> +  using std::pair;
> +  using std::swap;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::get;
> +  using std::in_place;
> +  using std::in_place_index;
> +  using std::in_place_index_t;
> +  using std::in_place_t;
> +  using std::in_place_type;
> +  using std::in_place_type_t;
> +  using std::make_pair;
> +  using std::piecewise_construct;
> +  using std::piecewise_construct_t;
> +  using std::tuple_element;
> +  using std::tuple_size;
> +  namespace rel_ops
> +  {
> +    using std::rel_ops::operator!=;
> +    using std::rel_ops::operator>;
> +    using std::rel_ops::operator<=;
> +    using std::rel_ops::operator>=;
> +  }
> +}
> +
> +// <valarray>
> +export namespace std
> +{
> +  using std::gslice;
> +  using std::gslice_array;
> +  using std::indirect_array;
> +  using std::mask_array;
> +  using std::slice;
> +  using std::slice_array;
> +  using std::swap;
> +  using std::valarray;
> +  using std::operator*;
> +  using std::operator/;
> +  using std::operator%;
> +  using std::operator+;
> +  using std::operator-;
> +  using std::operator^;
> +  using std::operator&;
> +  using std::operator|;
> +  using std::operator<<;
> +  using std::operator>>;
> +  using std::operator&&;
> +  using std::operator||;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::abs;
> +  using std::acos;
> +  using std::asin;
> +  using std::atan;
> +  using std::atan2;
> +  using std::begin;
> +  using std::cos;
> +  using std::cosh;
> +  using std::end;
> +  using std::exp;
> +  using std::log;
> +  using std::log10;
> +  using std::pow;
> +  using std::sin;
> +  using std::sinh;
> +  using std::sqrt;
> +  using std::tan;
> +  using std::tanh;
> +}
> +
> +// <variant>
> +export namespace std
> +{
> +  using std::get;
> +  using std::get_if;
> +  using std::holds_alternative;
> +  using std::variant;
> +  using std::variant_alternative;
> +  using std::variant_alternative_t;
> +  using std::variant_npos;
> +  using std::variant_size;
> +  using std::variant_size_v;
> +  using std::operator==;
> +  using std::operator!=;
> +  using std::operator<;
> +  using std::operator>;
> +  using std::operator<=;
> +  using std::operator>=;
> +  using std::operator<=>;
> +  using std::bad_variant_access;
> +  using std::hash;
> +  using std::monostate;
> +  using std::swap;
> +  using std::visit;
> +}
> +
> +// <vector>
> +export namespace std
> +{
> +  using std::vector;
> +  using std::operator==;
> +  using std::operator<=>;
> +  using std::erase;
> +  using std::erase_if;
> +  using std::swap;
> +  namespace pmr
> +  {
> +    using std::pmr::vector;
> +  }
> +  using std::hash;
> +}
> diff --git a/libstdc++-v3/src/c++23/modules/std.compat.cc b/libstdc++-v3/src/c++23/modules/std.compat.cc
> new file mode 100644
> index 00000000000..7d90f20378a
> --- /dev/null
> +++ b/libstdc++-v3/src/c++23/modules/std.compat.cc
> @@ -0,0 +1,640 @@
> +// -*- C++ -*- [std.modules] module std.compat
> +
> +// Copyright The GNU Toolchain Authors.
> +//
> +// This file is part of the GNU ISO C++ Library.  This library 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.
> +
> +// This library 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.
> +
> +// Under Section 7 of GPL version 3, you are granted additional
> +// permissions described in the GCC Runtime Library Exception, version
> +// 3.1, as published by the Free Software Foundation.
> +
> +// You should have received a copy of the GNU General Public License and
> +// a copy of the GCC Runtime Library Exception along with this program;
> +// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
> +// <http://www.gnu.org/licenses/>.
> +
> +export module std.compat;
> +export import std;
> +
> +#define STD_COMPAT
> +
> +// **** The below is copied verbatim from std.cc, starting with "C standard
> +// **** library headers" and ending with "End of C library".  Make any edits
> +// **** there and update the copy.
> +
> +// C standard library headers [tab:headers.cpp.c]
> +
> +#ifndef STD_COMPAT
> +#define C_LIB_NAMESPACE namespace std
> +#endif
> +
> +// 19.3 <cassert>
> +// No exports
> +
> +// 23.5.1 <cctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::isalnum;
> +  using std::isalpha;
> +  using std::isblank;
> +  using std::iscntrl;
> +  using std::isdigit;
> +  using std::isgraph;
> +  using std::islower;
> +  using std::isprint;
> +  using std::ispunct;
> +  using std::isspace;
> +  using std::isupper;
> +  using std::isxdigit;
> +  using std::tolower;
> +  using std::toupper;
> +}
> +
> +// 19.4 <cerrno>
> +// No exports
> +
> +// 28.3 <cfenv>
> +export C_LIB_NAMESPACE
> +{
> +  using std::feclearexcept;
> +  using std::fegetenv;
> +  using std::fegetexceptflag;
> +  using std::fegetround;
> +  using std::feholdexcept;
> +  using std::fenv_t;
> +  using std::feraiseexcept;
> +  using std::fesetenv;
> +  using std::fesetexceptflag;
> +  using std::fesetround;
> +  using std::fetestexcept;
> +  using std::feupdateenv;
> +  using std::fexcept_t;
> +}
> +
> +// 17.3.7 <cfloat> [cfloat.syn]
> +// No exports, only provides macros
> +
> +// 31.13.2 <cinttypes>
> +export C_LIB_NAMESPACE
> +{
> +  using std::imaxabs;
> +  using std::imaxdiv;
> +  using std::imaxdiv_t;
> +  using std::strtoimax;
> +  using std::strtoumax;
> +  using std::wcstoimax;
> +  using std::wcstoumax;
> +}
> +
> +// 17.3.6 <climits> [climits.syn]
> +// No exports, only provides macros
> +
> +// 30.5 <clocale>
> +export C_LIB_NAMESPACE
> +{
> +  using std::lconv;
> +  using std::localeconv;
> +  using std::setlocale;
> +  // LC_* macros not exported
> +}
> +
> +// 28.7.1 <cmath>
> +// FIXME missing special functions
> +export C_LIB_NAMESPACE
> +{
> +  using std::abs;
> +  using std::acos;
> +  using std::acosf;
> +  using std::acosh;
> +  using std::acoshf;
> +  using std::acoshl;
> +  using std::acosl;
> +  using std::asin;
> +  using std::asinf;
> +  using std::asinh;
> +  using std::asinhf;
> +  using std::asinhl;
> +  using std::asinl;
> +  using std::atan;
> +  using std::atan2;
> +  using std::atan2f;
> +  using std::atan2l;
> +  using std::atanf;
> +  using std::atanh;
> +  using std::atanhf;
> +  using std::atanhl;
> +  using std::atanl;
> +  using std::cbrt;
> +  using std::cbrtf;
> +  using std::cbrtl;
> +  using std::ceil;
> +  using std::ceilf;
> +  using std::ceill;
> +  using std::copysign;
> +  using std::copysignf;
> +  using std::copysignl;
> +  using std::cos;
> +  using std::cosf;
> +  using std::cosh;
> +  using std::coshf;
> +  using std::coshl;
> +  using std::cosl;
> +  using std::double_t;
> +  using std::erf;
> +  using std::erfc;
> +  using std::erfcf;
> +  using std::erfcl;
> +  using std::erff;
> +  using std::erfl;
> +  using std::exp;
> +  using std::exp2;
> +  using std::exp2f;
> +  using std::exp2l;
> +  using std::expf;
> +  using std::expl;
> +  using std::expm1;
> +  using std::expm1f;
> +  using std::expm1l;
> +  using std::fabs;
> +  using std::fabsf;
> +  using std::fabsl;
> +  using std::fdim;
> +  using std::fdimf;
> +  using std::fdiml;
> +  using std::float_t;
> +  using std::floor;
> +  using std::floorf;
> +  using std::floorl;
> +  using std::fma;
> +  using std::fmaf;
> +  using std::fmal;
> +  using std::fmax;
> +  using std::fmaxf;
> +  using std::fmaxl;
> +  using std::fmin;
> +  using std::fminf;
> +  using std::fminl;
> +  using std::fmod;
> +  using std::fmodf;
> +  using std::fmodl;
> +  using std::fpclassify;
> +  using std::frexp;
> +  using std::frexpf;
> +  using std::frexpl;
> +  using std::hypot;
> +  using std::hypotf;
> +  using std::hypotl;
> +  using std::ilogb;
> +  using std::ilogbf;
> +  using std::ilogbl;
> +  using std::isfinite;
> +  using std::isgreater;
> +  using std::isgreaterequal;
> +  using std::isinf;
> +  using std::isless;
> +  using std::islessequal;
> +  using std::islessgreater;
> +  using std::isnan;
> +  using std::isnormal;
> +  using std::isunordered;
> +  using std::ldexp;
> +  using std::ldexpf;
> +  using std::ldexpl;
> +#ifndef STD_COMPAT
> +  using std::lerp;
> +#endif
> +  using std::lgamma;
> +  using std::lgammaf;
> +  using std::lgammal;
> +  using std::llrint;
> +  using std::llrintf;
> +  using std::llrintl;
> +  using std::llround;
> +  using std::llroundf;
> +  using std::llroundl;
> +  using std::log;
> +  using std::log10;
> +  using std::log10f;
> +  using std::log10l;
> +  using std::log1p;
> +  using std::log1pf;
> +  using std::log1pl;
> +  using std::log2;
> +  using std::log2f;
> +  using std::log2l;
> +  using std::logb;
> +  using std::logbf;
> +  using std::logbl;
> +  using std::logf;
> +  using std::logl;
> +  using std::lrint;
> +  using std::lrintf;
> +  using std::lrintl;
> +  using std::lround;
> +  using std::lroundf;
> +  using std::lroundl;
> +  using std::modf;
> +  using std::modff;
> +  using std::modfl;
> +  using std::nan;
> +  using std::nanf;
> +  using std::nanl;
> +  using std::nearbyint;
> +  using std::nearbyintf;
> +  using std::nearbyintl;
> +  using std::nextafter;
> +  using std::nextafterf;
> +  using std::nextafterl;
> +  using std::nexttoward;
> +  using std::nexttowardf;
> +  using std::nexttowardl;
> +  using std::pow;
> +  using std::powf;
> +  using std::powl;
> +  using std::remainder;
> +  using std::remainderf;
> +  using std::remainderl;
> +  using std::remquo;
> +  using std::remquof;
> +  using std::remquol;
> +  using std::rint;
> +  using std::rintf;
> +  using std::rintl;
> +  using std::round;
> +  using std::roundf;
> +  using std::roundl;
> +  using std::scalbln;
> +  using std::scalblnf;
> +  using std::scalblnl;
> +  using std::scalbn;
> +  using std::scalbnf;
> +  using std::scalbnl;
> +  using std::signbit;
> +  using std::sin;
> +  using std::sinf;
> +  using std::sinh;
> +  using std::sinhf;
> +  using std::sinhl;
> +  using std::sinl;
> +  using std::sqrt;
> +  using std::sqrtf;
> +  using std::sqrtl;
> +  using std::tan;
> +  using std::tanf;
> +  using std::tanh;
> +  using std::tanhf;
> +  using std::tanhl;
> +  using std::tanl;
> +  using std::tgamma;
> +  using std::tgammaf;
> +  using std::tgammal;
> +  using std::trunc;
> +  using std::truncf;
> +  using std::truncl;
> +}
> +
> +// 17.13.3 <csetjmp>
> +export C_LIB_NAMESPACE
> +{
> +  using std::jmp_buf;
> +  using std::longjmp;
> +  // setjmp macro not exported
> +}
> +
> +// 17.13.4 <csignal>
> +export C_LIB_NAMESPACE
> +{
> +  using std::raise;
> +  using std::sig_atomic_t;
> +  using std::signal;
> +  // SIG_* macros not exported
> +}
> +
> +// 17.13.2 <cstdarg>
> +export C_LIB_NAMESPACE
> +{
> +  using std::va_list;
> +  // va_arg and friend macros not exported
> +}
> +
> +// 17.2.1 <cstddef> [cstddef.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::max_align_t;
> +  using std::nullptr_t;
> +  using std::ptrdiff_t;
> +  using std::size_t;
> +#ifndef STD_COMPAT
> +  using std::byte;
> +  using std::operator<<=;
> +  using std::operator<<;
> +  using std::operator>>=;
> +  using std::operator>>;
> +  using std::operator|=;
> +  using std::operator|;
> +  using std::operator&=;
> +  using std::operator&;
> +  using std::operator^=;
> +  using std::operator^;
> +  using std::operator~;
> +  using std::to_integer;
> +#endif
> +  // NULL and offsetof macros not exported
> +}
> +
> +// 17.4 <cstdint>
> +export C_LIB_NAMESPACE
> +{
> +  using std::int8_t;
> +  using std::int16_t;
> +  using std::int32_t;
> +  using std::int64_t;
> +  using std::int_fast16_t;
> +  using std::int_fast32_t;
> +  using std::int_fast64_t;
> +  using std::int_fast8_t;
> +  using std::int_least16_t;
> +  using std::int_least32_t;
> +  using std::int_least64_t;
> +  using std::int_least8_t;
> +  using std::intmax_t;
> +  using std::intptr_t;
> +  using std::uint8_t;
> +  using std::uint16_t;
> +  using std::uint32_t;
> +  using std::uint64_t;
> +  using std::uint_fast16_t;
> +  using std::uint_fast32_t;
> +  using std::uint_fast64_t;
> +  using std::uint_fast8_t;
> +  using std::uint_least16_t;
> +  using std::uint_least32_t;
> +  using std::uint_least64_t;
> +  using std::uint_least8_t;
> +  using std::uintmax_t;
> +  using std::uintptr_t;
> +}
> +
> +// 31.13.1 <cstdio>
> +export C_LIB_NAMESPACE
> +{
> +  using std::clearerr;
> +  using std::fclose;
> +  using std::feof;
> +  using std::ferror;
> +  using std::fflush;
> +  using std::fgetc;
> +  using std::fgetpos;
> +  using std::fgets;
> +  using std::FILE;
> +  using std::fopen;
> +  using std::fpos_t;
> +  using std::fprintf;
> +  using std::fputc;
> +  using std::fputs;
> +  using std::fread;
> +  using std::freopen;
> +  using std::fscanf;
> +  using std::fseek;
> +  using std::fsetpos;
> +  using std::ftell;
> +  using std::fwrite;
> +  using std::getc;
> +  using std::getchar;
> +  using std::perror;
> +  using std::printf;
> +  using std::putc;
> +  using std::putchar;
> +  using std::puts;
> +  using std::remove;
> +  using std::rename;
> +  using std::rewind;
> +  using std::scanf;
> +  using std::setbuf;
> +  using std::setvbuf;
> +  using std::size_t;
> +  using std::snprintf;
> +  using std::sprintf;
> +  using std::sscanf;
> +  using std::tmpfile;
> +  using std::tmpnam;
> +  using std::ungetc;
> +  using std::vfprintf;
> +  using std::vfscanf;
> +  using std::vprintf;
> +  using std::vscanf;
> +  using std::vsnprintf;
> +  using std::vsprintf;
> +  using std::vsscanf;
> +}
> +
> +// 17.2.2 <cstdlib> [cstdlib.syn]
> +export C_LIB_NAMESPACE
> +{
> +  using std::_Exit;
> +  using std::abort;
> +  using std::abs;
> +  using std::aligned_alloc;
> +  using std::at_quick_exit;
> +  using std::atexit;
> +  using std::atof;
> +  using std::atoi;
> +  using std::atol;
> +  using std::atoll;
> +  using std::bsearch;
> +  using std::calloc;
> +  using std::div;
> +  using std::div_t;
> +  using std::exit;
> +  using std::free;
> +  using std::getenv;
> +  using std::labs;
> +  using std::ldiv;
> +  using std::ldiv_t;
> +  using std::llabs;
> +  using std::lldiv;
> +  using std::lldiv_t;
> +  using std::malloc;
> +  using std::mblen;
> +  using std::mbstowcs;
> +  using std::mbtowc;
> +  using std::qsort;
> +  using std::quick_exit;
> +  using std::rand;
> +  using std::realloc;
> +  using std::size_t;
> +  using std::srand;
> +  using std::strtod;
> +  using std::strtof;
> +  using std::strtol;
> +  using std::strtold;
> +  using std::strtoll;
> +  using std::strtoul;
> +  using std::strtoull;
> +  using std::system;
> +  using std::wcstombs;
> +  using std::wctomb;
> +}
> +
> +// 23.5.3 <cstring>
> +export C_LIB_NAMESPACE
> +{
> +  using std::memchr;
> +  using std::memcmp;
> +  using std::memcpy;
> +  using std::memmove;
> +  using std::memset;
> +  using std::size_t;
> +  using std::strcat;
> +  using std::strchr;
> +  using std::strcmp;
> +  using std::strcoll;
> +  using std::strcpy;
> +  using std::strcspn;
> +  using std::strerror;
> +  using std::strlen;
> +  using std::strncat;
> +  using std::strncmp;
> +  using std::strncpy;
> +  using std::strpbrk;
> +  using std::strrchr;
> +  using std::strspn;
> +  using std::strstr;
> +  using std::strtok;
> +  using std::strxfrm;
> +}
> +
> +// 29.15 <ctime>
> +export C_LIB_NAMESPACE
> +{
> +  using std::asctime;
> +  using std::clock;
> +  using std::clock_t;
> +  using std::ctime;
> +  using std::difftime;
> +  using std::gmtime;
> +  using std::localtime;
> +  using std::mktime;
> +  using std::size_t;
> +  using std::strftime;
> +  using std::time;
> +  using std::time_t;
> +  using std::timespec;
> +  using std::tm;
> +  using std::timespec_get;
> +}
> +
> +// 23.5.5 <cuchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::mbrtoc8;
> +  using std::c8rtomb;
> +  using std::mbrtoc16;
> +  using std::c16rtomb;
> +  using std::mbrtoc32;
> +  using std::c32rtomb;
> +}
> +
> +// 23.5.4 <cwchar>
> +export C_LIB_NAMESPACE
> +{
> +  using std::btowc;
> +  using std::fgetwc;
> +  using std::fgetws;
> +  using std::fputwc;
> +  using std::fputws;
> +  using std::fwide;
> +  using std::fwprintf;
> +  using std::fwscanf;
> +  using std::getwc;
> +  using std::getwchar;
> +  using std::mbrlen;
> +  using std::mbrtowc;
> +  using std::mbsinit;
> +  using std::mbsrtowcs;
> +  using std::mbstate_t;
> +  using std::putwc;
> +  using std::putwchar;
> +  using std::size_t;
> +  using std::swprintf;
> +  using std::swscanf;
> +  using std::tm;
> +  using std::ungetwc;
> +  using std::vfwprintf;
> +  using std::vfwscanf;
> +  using std::vswprintf;
> +  using std::vswscanf;
> +  using std::vwprintf;
> +  using std::vwscanf;
> +  using std::wcrtomb;
> +  using std::wcscat;
> +  using std::wcschr;
> +  using std::wcscmp;
> +  using std::wcscoll;
> +  using std::wcscpy;
> +  using std::wcscspn;
> +  using std::wcsftime;
> +  using std::wcslen;
> +  using std::wcsncat;
> +  using std::wcsncmp;
> +  using std::wcsncpy;
> +  using std::wcspbrk;
> +  using std::wcsrchr;
> +  using std::wcsrtombs;
> +  using std::wcsspn;
> +  using std::wcsstr;
> +  using std::wcstod;
> +  using std::wcstof;
> +  using std::wcstok;
> +  using std::wcstol;
> +  using std::wcstold;
> +  using std::wcstoll;
> +  using std::wcstoul;
> +  using std::wcstoull;
> +  using std::wcsxfrm;
> +  using std::wctob;
> +  using std::wint_t;
> +  using std::wmemchr;
> +  using std::wmemcmp;
> +  using std::wmemcpy;
> +  using std::wmemmove;
> +  using std::wmemset;
> +  using std::wprintf;
> +  using std::wscanf;
> +}
> +
> +// 23.5.2 <cwctype>
> +export C_LIB_NAMESPACE
> +{
> +  using std::iswalnum;
> +  using std::iswalpha;
> +  using std::iswblank;
> +  using std::iswcntrl;
> +  using std::iswctype;
> +  using std::iswdigit;
> +  using std::iswgraph;
> +  using std::iswlower;
> +  using std::iswprint;
> +  using std::iswpunct;
> +  using std::iswspace;
> +  using std::iswupper;
> +  using std::iswxdigit;
> +  using std::towctrans;
> +  using std::towlower;
> +  using std::towupper;
> +  using std::wctrans;
> +  using std::wctrans_t;
> +  using std::wctype;
> +  using std::wctype_t;
> +  using std::wint_t;
> +}
> +
> +// **** End of C library ****
> diff --git a/contrib/relpath.sh b/contrib/relpath.sh
> new file mode 100755
> index 00000000000..51bde081636
> --- /dev/null
> +++ b/contrib/relpath.sh
> @@ -0,0 +1,70 @@
> +#!/bin/sh
> +
> +if [ "$1" == "--help" ]; then
> +    echo Usage: relpath.sh FROM TO
> +    echo Print the relative path from FROM to TO
> +    echo FROM must be a directory, but need not exist
> +fi
> +
> +if [ -f "$1" ]; then
> +    echo first argument must be a directory
> +    exit 1
> +fi
> +
> +from="${1%%/}"
> +to="${2%%/}"
> +
> +# Canonicalize directories if they contain '..'.
> +canonicalize() {
> +    path=$1
> +    suffix=
> +    while ! [ -d "$path" ]; do
> +	name=$(basename "$path")
> +	# Give up on a .. that doesn't exist.
> +	if [ $"name" = ".." ]; then break; fi
> +	path=$(dirname "$path")
> +	suffix="/$name$suffix"
> +    done
> +    if [ -d "$path" ]; then
> +	echo $(cd "$path"; pwd)$suffix
> +    else
> +	echo $1
> +    fi
> +}
> +
> +case "$to$from" in
> +    *..* )
> +	from=$(canonicalize "$from")
> +	to=$(canonicalize "$to")
> +	;;
> +esac
> +case "$to$from" in
> +    *..* )
> +	echo unable to canonicalize ..
> +	exit 1
> +	;;
> +esac
> +
> +back=
> +while [ "${to#$from}" = "$to" ]; do
> +    #echo $from too long
> +    from=$(dirname $from);
> +    back=../$back
> +
> +    if [ "$from" = "/" ]; then
> +	echo $to
> +	exit 0
> +    fi
> +done
> +
> +to=${to#$from}
> +to=${to##/}
> +back=${back%%/}
> +
> +if [ -n "$to" ] && [ -n "$back" ]; then
> +    echo $back/$to
> +elif [ -n "$back$to" ]; then
> +    echo $back$to
> +else
> +    echo .
> +fi
> diff --git a/libstdc++-v3/src/c++23/Makefile.am b/libstdc++-v3/src/c++23/Makefile.am
> index 74996d1e147..f8149e77102 100644
> --- a/libstdc++-v3/src/c++23/Makefile.am
> +++ b/libstdc++-v3/src/c++23/Makefile.am
> @@ -25,6 +25,24 @@ include $(top_srcdir)/fragment.am
> # Convenience library for C++23 runtime.
> noinst_LTLIBRARIES = libc++23convenience.la
> 
> +# module std support.  Not compiled for now, only installed.
> +toolexeclib_DATA = libstdc++.modules.json
> +nobase_pkgdata_DATA = modules/std.cc modules/std.compat.cc
> +
> +# The manifest to be installed uses the relative path between install dirs.
> +libstdc++.modules.json: libstdc++.modules.json.in
> +	relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \
> +		$(toolexeclibdir) $(pkgdatadir)) && \
> +	sed "s,@MODPATH@,$$relpath," $< > $@
> +
> +# The uninstalled manifest uses the absolute path to srcdir.
> +stamp-modules: libstdc++.modules.json.in
> +	sed 's,@MODPATH@,$(srcdir),' $< \
> +	  > ../.libs/libstdc++.modules.json
> +	@touch stamp-modules
> +
> +all-local: stamp-modules
> +
> headers =
> 
> if ENABLE_EXTERN_TEMPLATE
> diff --git a/libstdc++-v3/src/c++23/Makefile.in b/libstdc++-v3/src/c++23/Makefile.in
> index ce609688025..f57232b5035 100644
> --- a/libstdc++-v3/src/c++23/Makefile.in
> +++ b/libstdc++-v3/src/c++23/Makefile.in
> @@ -14,6 +14,7 @@
> 
> @SET_MAKE@
> 
> +
> VPATH = @srcdir@
> am__is_gnu_make = { \
>   if test -z '$(MAKELEVEL)'; then \
> @@ -162,6 +163,36 @@ am__can_run_installinfo = \
>     n|no|NO) false;; \
>     *) (install-info --version) >/dev/null 2>&1;; \
>   esac
> +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
> +am__vpath_adj = case $$p in \
> +    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
> +    *) f=$$p;; \
> +  esac;
> +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
> +am__install_max = 40
> +am__nobase_strip_setup = \
> +  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
> +am__nobase_strip = \
> +  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
> +am__nobase_list = $(am__nobase_strip_setup); \
> +  for p in $$list; do echo "$$p $$p"; done | \
> +  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
> +  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
> +    if (++n[$$2] == $(am__install_max)) \
> +      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
> +    END { for (dir in files) print dir, files[dir] }'
> +am__base_list = \
> +  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
> +  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
> +am__uninstall_files_from_dir = { \
> +  test -z "$$files" \
> +    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
> +    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
> +         $(am__cd) "$$dir" && rm -f $$files; }; \
> +  }
> +am__installdirs = "$(DESTDIR)$(pkgdatadir)" \
> +	"$(DESTDIR)$(toolexeclibdir)"
> +DATA = $(nobase_pkgdata_DATA) $(toolexeclib_DATA)
> am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
> # Read a list of newline-separated strings from the standard input,
> # and print each of them once, without duplicates.  Input order is
> @@ -424,6 +455,10 @@ AM_CPPFLAGS = $(GLIBCXX_INCLUDES) $(CPPFLAGS)
> 
> # Convenience library for C++23 runtime.
> noinst_LTLIBRARIES = libc++23convenience.la
> +
> +# module std support.  Not compiled for now, only installed.
> +toolexeclib_DATA = libstdc++.modules.json
> +nobase_pkgdata_DATA = modules/std.cc modules/std.compat.cc
> headers = 
> # XTEMPLATE_FLAGS =
> @ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources = 
> @@ -566,6 +601,51 @@ mostlyclean-libtool:
> 
> clean-libtool:
> 	-rm -rf .libs _libs
> +install-nobase_pkgdataDATA: $(nobase_pkgdata_DATA)
> +	@$(NORMAL_INSTALL)
> +	@list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
> +	if test -n "$$list"; then \
> +	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
> +	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
> +	fi; \
> +	$(am__nobase_list) | while read dir files; do \
> +	  xfiles=; for file in $$files; do \
> +	    if test -f "$$file"; then xfiles="$$xfiles $$file"; \
> +	    else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
> +	  test -z "$$xfiles" || { \
> +	    test "x$$dir" = x. || { \
> +	      echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
> +	      $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \
> +	    echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
> +	    $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \
> +	done
> +
> +uninstall-nobase_pkgdataDATA:
> +	@$(NORMAL_UNINSTALL)
> +	@list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
> +	$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
> +	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
> +install-toolexeclibDATA: $(toolexeclib_DATA)
> +	@$(NORMAL_INSTALL)
> +	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
> +	if test -n "$$list"; then \
> +	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
> +	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
> +	fi; \
> +	for p in $$list; do \
> +	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
> +	  echo "$$d$$p"; \
> +	done | $(am__base_list) | \
> +	while read files; do \
> +	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibdir)'"; \
> +	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibdir)" || exit $$?; \
> +	done
> +
> +uninstall-toolexeclibDATA:
> +	@$(NORMAL_UNINSTALL)
> +	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
> +	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
> +	dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir)
> 
> ID: $(am__tagged_files)
> 	$(am__define_uniq_tagged_files); mkid -fID $$unique
> @@ -620,8 +700,11 @@ distclean-tags:
> 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
> check-am: all-am
> check: check-am
> -all-am: Makefile $(LTLIBRARIES)
> +all-am: Makefile $(LTLIBRARIES) $(DATA) all-local
> installdirs:
> +	for dir in "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(toolexeclibdir)"; do \
> +	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
> +	done
> install: install-am
> install-exec: install-exec-am
> install-data: install-data-am
> @@ -674,13 +757,13 @@ info: info-am
> 
> info-am:
> 
> -install-data-am:
> +install-data-am: install-nobase_pkgdataDATA
> 
> install-dvi: install-dvi-am
> 
> install-dvi-am:
> 
> -install-exec-am:
> +install-exec-am: install-toolexeclibDATA
> 
> install-html: install-html-am
> 
> @@ -719,27 +802,43 @@ ps: ps-am
> 
> ps-am:
> 
> -uninstall-am:
> +uninstall-am: uninstall-nobase_pkgdataDATA uninstall-toolexeclibDATA
> 
> .MAKE: install-am install-strip
> 
> -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
> -	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
> -	ctags-am distclean distclean-compile distclean-generic \
> -	distclean-libtool distclean-tags dvi dvi-am html html-am info \
> -	info-am install install-am install-data install-data-am \
> -	install-dvi install-dvi-am install-exec install-exec-am \
> -	install-html install-html-am install-info install-info-am \
> -	install-man install-pdf install-pdf-am install-ps \
> -	install-ps-am install-strip installcheck installcheck-am \
> -	installdirs maintainer-clean maintainer-clean-generic \
> -	mostlyclean mostlyclean-compile mostlyclean-generic \
> -	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
> -	uninstall-am
> +.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
> +	clean-generic clean-libtool clean-noinstLTLIBRARIES \
> +	cscopelist-am ctags ctags-am distclean distclean-compile \
> +	distclean-generic distclean-libtool distclean-tags dvi dvi-am \
> +	html html-am info info-am install install-am install-data \
> +	install-data-am install-dvi install-dvi-am install-exec \
> +	install-exec-am install-html install-html-am install-info \
> +	install-info-am install-man install-nobase_pkgdataDATA \
> +	install-pdf install-pdf-am install-ps install-ps-am \
> +	install-strip install-toolexeclibDATA installcheck \
> +	installcheck-am installdirs maintainer-clean \
> +	maintainer-clean-generic mostlyclean mostlyclean-compile \
> +	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
> +	tags tags-am uninstall uninstall-am \
> +	uninstall-nobase_pkgdataDATA uninstall-toolexeclibDATA
> 
> .PRECIOUS: Makefile
> 
> 
> +# The manifest to be installed uses the relative path between install dirs.
> +libstdc++.modules.json: libstdc++.modules.json.in
> +	relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \
> +		$(toolexeclibdir) $(pkgdatadir)) && \
> +	sed "s,@MODPATH@,$$relpath," $< > $@
> +
> +# The uninstalled manifest uses the absolute path to srcdir.
> +stamp-modules: libstdc++.modules.json.in
> +	sed 's,@MODPATH@,$(srcdir),' $< \
> +	  > ../.libs/libstdc++.modules.json
> +	@touch stamp-modules
> +
> +all-local: stamp-modules
> +
> vpath % $(top_srcdir)/src/c++23
> 
> # Use C++26 so that std::filebuf::native_handle() is available.
> diff --git a/libstdc++-v3/src/c++23/libstdc++.modules.json.in b/libstdc++-v3/src/c++23/libstdc++.modules.json.in
> new file mode 100644
> index 00000000000..50714d9c164
> --- /dev/null
> +++ b/libstdc++-v3/src/c++23/libstdc++.modules.json.in
> @@ -0,0 +1,17 @@
> +// C++ module metadata, to install alongside libstdc++.so
> +{
> +  "version": 1,
> +  "revision": 1,
> +  "modules": [
> +    {
> +      "logical-name": "std",
> +      "source-path": "@MODPATH@/modules/std.cc",
> +      "is-std-library": true
> +    },
> +    {
> +      "logical-name": "std.compat",
> +      "source-path": "@MODPATH@/modules/std.compat.cc",
> +      "is-std-library": true
> +    }
> +  ]
> +}
> 
> base-commit: 453d3d90c374d3bb329f1431b7dfb8d0510a88b9
> -- 
> 2.47.0
>
diff mbox series

Patch

diff --git a/libstdc++-v3/src/c++23/modules/std.cc b/libstdc++-v3/src/c++23/modules/std.cc
new file mode 100644
index 00000000000..d823b915b9c
--- /dev/null
+++ b/libstdc++-v3/src/c++23/modules/std.cc
@@ -0,0 +1,3575 @@ 
+// -*- C++ -*- [std.modules] module std
+
+// Copyright The GNU Toolchain Authors.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+module;
+
+#include <bits/stdc++.h>
+
+// ??? Commented out in stdc++.h
+#include <execution>
+
+#undef __DEPRECATED
+#include <strstream>
+
+export module std;
+
+// **** Any changes to the C library section below must also be made to the
+// **** verbatim copy in std.compat.cc.
+
+// C standard library headers [tab:headers.cpp.c]
+
+#ifndef STD_COMPAT
+#define C_LIB_NAMESPACE namespace std
+#endif
+
+// 19.3 <cassert>
+// No exports
+
+// 23.5.1 <cctype>
+export C_LIB_NAMESPACE
+{
+  using std::isalnum;
+  using std::isalpha;
+  using std::isblank;
+  using std::iscntrl;
+  using std::isdigit;
+  using std::isgraph;
+  using std::islower;
+  using std::isprint;
+  using std::ispunct;
+  using std::isspace;
+  using std::isupper;
+  using std::isxdigit;
+  using std::tolower;
+  using std::toupper;
+}
+
+// 19.4 <cerrno>
+// No exports
+
+// 28.3 <cfenv>
+export C_LIB_NAMESPACE
+{
+  using std::feclearexcept;
+  using std::fegetenv;
+  using std::fegetexceptflag;
+  using std::fegetround;
+  using std::feholdexcept;
+  using std::fenv_t;
+  using std::feraiseexcept;
+  using std::fesetenv;
+  using std::fesetexceptflag;
+  using std::fesetround;
+  using std::fetestexcept;
+  using std::feupdateenv;
+  using std::fexcept_t;
+}
+
+// 17.3.7 <cfloat> [cfloat.syn]
+// No exports, only provides macros
+
+// 31.13.2 <cinttypes>
+export C_LIB_NAMESPACE
+{
+  using std::imaxabs;
+  using std::imaxdiv;
+  using std::imaxdiv_t;
+  using std::strtoimax;
+  using std::strtoumax;
+  using std::wcstoimax;
+  using std::wcstoumax;
+}
+
+// 17.3.6 <climits> [climits.syn]
+// No exports, only provides macros
+
+// 30.5 <clocale>
+export C_LIB_NAMESPACE
+{
+  using std::lconv;
+  using std::localeconv;
+  using std::setlocale;
+  // LC_* macros not exported
+}
+
+// 28.7.1 <cmath>
+// FIXME missing special functions
+export C_LIB_NAMESPACE
+{
+  using std::abs;
+  using std::acos;
+  using std::acosf;
+  using std::acosh;
+  using std::acoshf;
+  using std::acoshl;
+  using std::acosl;
+  using std::asin;
+  using std::asinf;
+  using std::asinh;
+  using std::asinhf;
+  using std::asinhl;
+  using std::asinl;
+  using std::atan;
+  using std::atan2;
+  using std::atan2f;
+  using std::atan2l;
+  using std::atanf;
+  using std::atanh;
+  using std::atanhf;
+  using std::atanhl;
+  using std::atanl;
+  using std::cbrt;
+  using std::cbrtf;
+  using std::cbrtl;
+  using std::ceil;
+  using std::ceilf;
+  using std::ceill;
+  using std::copysign;
+  using std::copysignf;
+  using std::copysignl;
+  using std::cos;
+  using std::cosf;
+  using std::cosh;
+  using std::coshf;
+  using std::coshl;
+  using std::cosl;
+  using std::double_t;
+  using std::erf;
+  using std::erfc;
+  using std::erfcf;
+  using std::erfcl;
+  using std::erff;
+  using std::erfl;
+  using std::exp;
+  using std::exp2;
+  using std::exp2f;
+  using std::exp2l;
+  using std::expf;
+  using std::expl;
+  using std::expm1;
+  using std::expm1f;
+  using std::expm1l;
+  using std::fabs;
+  using std::fabsf;
+  using std::fabsl;
+  using std::fdim;
+  using std::fdimf;
+  using std::fdiml;
+  using std::float_t;
+  using std::floor;
+  using std::floorf;
+  using std::floorl;
+  using std::fma;
+  using std::fmaf;
+  using std::fmal;
+  using std::fmax;
+  using std::fmaxf;
+  using std::fmaxl;
+  using std::fmin;
+  using std::fminf;
+  using std::fminl;
+  using std::fmod;
+  using std::fmodf;
+  using std::fmodl;
+  using std::fpclassify;
+  using std::frexp;
+  using std::frexpf;
+  using std::frexpl;
+  using std::hypot;
+  using std::hypotf;
+  using std::hypotl;
+  using std::ilogb;
+  using std::ilogbf;
+  using std::ilogbl;
+  using std::isfinite;
+  using std::isgreater;
+  using std::isgreaterequal;
+  using std::isinf;
+  using std::isless;
+  using std::islessequal;
+  using std::islessgreater;
+  using std::isnan;
+  using std::isnormal;
+  using std::isunordered;
+  using std::ldexp;
+  using std::ldexpf;
+  using std::ldexpl;
+#ifndef STD_COMPAT
+  using std::lerp;
+#endif
+  using std::lgamma;
+  using std::lgammaf;
+  using std::lgammal;
+  using std::llrint;
+  using std::llrintf;
+  using std::llrintl;
+  using std::llround;
+  using std::llroundf;
+  using std::llroundl;
+  using std::log;
+  using std::log10;
+  using std::log10f;
+  using std::log10l;
+  using std::log1p;
+  using std::log1pf;
+  using std::log1pl;
+  using std::log2;
+  using std::log2f;
+  using std::log2l;
+  using std::logb;
+  using std::logbf;
+  using std::logbl;
+  using std::logf;
+  using std::logl;
+  using std::lrint;
+  using std::lrintf;
+  using std::lrintl;
+  using std::lround;
+  using std::lroundf;
+  using std::lroundl;
+  using std::modf;
+  using std::modff;
+  using std::modfl;
+  using std::nan;
+  using std::nanf;
+  using std::nanl;
+  using std::nearbyint;
+  using std::nearbyintf;
+  using std::nearbyintl;
+  using std::nextafter;
+  using std::nextafterf;
+  using std::nextafterl;
+  using std::nexttoward;
+  using std::nexttowardf;
+  using std::nexttowardl;
+  using std::pow;
+  using std::powf;
+  using std::powl;
+  using std::remainder;
+  using std::remainderf;
+  using std::remainderl;
+  using std::remquo;
+  using std::remquof;
+  using std::remquol;
+  using std::rint;
+  using std::rintf;
+  using std::rintl;
+  using std::round;
+  using std::roundf;
+  using std::roundl;
+  using std::scalbln;
+  using std::scalblnf;
+  using std::scalblnl;
+  using std::scalbn;
+  using std::scalbnf;
+  using std::scalbnl;
+  using std::signbit;
+  using std::sin;
+  using std::sinf;
+  using std::sinh;
+  using std::sinhf;
+  using std::sinhl;
+  using std::sinl;
+  using std::sqrt;
+  using std::sqrtf;
+  using std::sqrtl;
+  using std::tan;
+  using std::tanf;
+  using std::tanh;
+  using std::tanhf;
+  using std::tanhl;
+  using std::tanl;
+  using std::tgamma;
+  using std::tgammaf;
+  using std::tgammal;
+  using std::trunc;
+  using std::truncf;
+  using std::truncl;
+}
+
+// 17.13.3 <csetjmp>
+export C_LIB_NAMESPACE
+{
+  using std::jmp_buf;
+  using std::longjmp;
+  // setjmp macro not exported
+}
+
+// 17.13.4 <csignal>
+export C_LIB_NAMESPACE
+{
+  using std::raise;
+  using std::sig_atomic_t;
+  using std::signal;
+  // SIG_* macros not exported
+}
+
+// 17.13.2 <cstdarg>
+export C_LIB_NAMESPACE
+{
+  using std::va_list;
+  // va_arg and friend macros not exported
+}
+
+// 17.2.1 <cstddef> [cstddef.syn]
+export C_LIB_NAMESPACE
+{
+  using std::max_align_t;
+  using std::nullptr_t;
+  using std::ptrdiff_t;
+  using std::size_t;
+#ifndef STD_COMPAT
+  using std::byte;
+  using std::operator<<=;
+  using std::operator<<;
+  using std::operator>>=;
+  using std::operator>>;
+  using std::operator|=;
+  using std::operator|;
+  using std::operator&=;
+  using std::operator&;
+  using std::operator^=;
+  using std::operator^;
+  using std::operator~;
+  using std::to_integer;
+#endif
+  // NULL and offsetof macros not exported
+}
+
+// 17.4 <cstdint>
+export C_LIB_NAMESPACE
+{
+  using std::int8_t;
+  using std::int16_t;
+  using std::int32_t;
+  using std::int64_t;
+  using std::int_fast16_t;
+  using std::int_fast32_t;
+  using std::int_fast64_t;
+  using std::int_fast8_t;
+  using std::int_least16_t;
+  using std::int_least32_t;
+  using std::int_least64_t;
+  using std::int_least8_t;
+  using std::intmax_t;
+  using std::intptr_t;
+  using std::uint8_t;
+  using std::uint16_t;
+  using std::uint32_t;
+  using std::uint64_t;
+  using std::uint_fast16_t;
+  using std::uint_fast32_t;
+  using std::uint_fast64_t;
+  using std::uint_fast8_t;
+  using std::uint_least16_t;
+  using std::uint_least32_t;
+  using std::uint_least64_t;
+  using std::uint_least8_t;
+  using std::uintmax_t;
+  using std::uintptr_t;
+}
+
+// 31.13.1 <cstdio>
+export C_LIB_NAMESPACE
+{
+  using std::clearerr;
+  using std::fclose;
+  using std::feof;
+  using std::ferror;
+  using std::fflush;
+  using std::fgetc;
+  using std::fgetpos;
+  using std::fgets;
+  using std::FILE;
+  using std::fopen;
+  using std::fpos_t;
+  using std::fprintf;
+  using std::fputc;
+  using std::fputs;
+  using std::fread;
+  using std::freopen;
+  using std::fscanf;
+  using std::fseek;
+  using std::fsetpos;
+  using std::ftell;
+  using std::fwrite;
+  using std::getc;
+  using std::getchar;
+  using std::perror;
+  using std::printf;
+  using std::putc;
+  using std::putchar;
+  using std::puts;
+  using std::remove;
+  using std::rename;
+  using std::rewind;
+  using std::scanf;
+  using std::setbuf;
+  using std::setvbuf;
+  using std::size_t;
+  using std::snprintf;
+  using std::sprintf;
+  using std::sscanf;
+  using std::tmpfile;
+  using std::tmpnam;
+  using std::ungetc;
+  using std::vfprintf;
+  using std::vfscanf;
+  using std::vprintf;
+  using std::vscanf;
+  using std::vsnprintf;
+  using std::vsprintf;
+  using std::vsscanf;
+}
+
+// 17.2.2 <cstdlib> [cstdlib.syn]
+export C_LIB_NAMESPACE
+{
+  using std::_Exit;
+  using std::abort;
+  using std::abs;
+  using std::aligned_alloc;
+  using std::at_quick_exit;
+  using std::atexit;
+  using std::atof;
+  using std::atoi;
+  using std::atol;
+  using std::atoll;
+  using std::bsearch;
+  using std::calloc;
+  using std::div;
+  using std::div_t;
+  using std::exit;
+  using std::free;
+  using std::getenv;
+  using std::labs;
+  using std::ldiv;
+  using std::ldiv_t;
+  using std::llabs;
+  using std::lldiv;
+  using std::lldiv_t;
+  using std::malloc;
+  using std::mblen;
+  using std::mbstowcs;
+  using std::mbtowc;
+  using std::qsort;
+  using std::quick_exit;
+  using std::rand;
+  using std::realloc;
+  using std::size_t;
+  using std::srand;
+  using std::strtod;
+  using std::strtof;
+  using std::strtol;
+  using std::strtold;
+  using std::strtoll;
+  using std::strtoul;
+  using std::strtoull;
+  using std::system;
+  using std::wcstombs;
+  using std::wctomb;
+}
+
+// 23.5.3 <cstring>
+export C_LIB_NAMESPACE
+{
+  using std::memchr;
+  using std::memcmp;
+  using std::memcpy;
+  using std::memmove;
+  using std::memset;
+  using std::size_t;
+  using std::strcat;
+  using std::strchr;
+  using std::strcmp;
+  using std::strcoll;
+  using std::strcpy;
+  using std::strcspn;
+  using std::strerror;
+  using std::strlen;
+  using std::strncat;
+  using std::strncmp;
+  using std::strncpy;
+  using std::strpbrk;
+  using std::strrchr;
+  using std::strspn;
+  using std::strstr;
+  using std::strtok;
+  using std::strxfrm;
+}
+
+// 29.15 <ctime>
+export C_LIB_NAMESPACE
+{
+  using std::asctime;
+  using std::clock;
+  using std::clock_t;
+  using std::ctime;
+  using std::difftime;
+  using std::gmtime;
+  using std::localtime;
+  using std::mktime;
+  using std::size_t;
+  using std::strftime;
+  using std::time;
+  using std::time_t;
+  using std::timespec;
+  using std::tm;
+  using std::timespec_get;
+}
+
+// 23.5.5 <cuchar>
+export C_LIB_NAMESPACE
+{
+  using std::mbrtoc8;
+  using std::c8rtomb;
+  using std::mbrtoc16;
+  using std::c16rtomb;
+  using std::mbrtoc32;
+  using std::c32rtomb;
+}
+
+// 23.5.4 <cwchar>
+export C_LIB_NAMESPACE
+{
+  using std::btowc;
+  using std::fgetwc;
+  using std::fgetws;
+  using std::fputwc;
+  using std::fputws;
+  using std::fwide;
+  using std::fwprintf;
+  using std::fwscanf;
+  using std::getwc;
+  using std::getwchar;
+  using std::mbrlen;
+  using std::mbrtowc;
+  using std::mbsinit;
+  using std::mbsrtowcs;
+  using std::mbstate_t;
+  using std::putwc;
+  using std::putwchar;
+  using std::size_t;
+  using std::swprintf;
+  using std::swscanf;
+  using std::tm;
+  using std::ungetwc;
+  using std::vfwprintf;
+  using std::vfwscanf;
+  using std::vswprintf;
+  using std::vswscanf;
+  using std::vwprintf;
+  using std::vwscanf;
+  using std::wcrtomb;
+  using std::wcscat;
+  using std::wcschr;
+  using std::wcscmp;
+  using std::wcscoll;
+  using std::wcscpy;
+  using std::wcscspn;
+  using std::wcsftime;
+  using std::wcslen;
+  using std::wcsncat;
+  using std::wcsncmp;
+  using std::wcsncpy;
+  using std::wcspbrk;
+  using std::wcsrchr;
+  using std::wcsrtombs;
+  using std::wcsspn;
+  using std::wcsstr;
+  using std::wcstod;
+  using std::wcstof;
+  using std::wcstok;
+  using std::wcstol;
+  using std::wcstold;
+  using std::wcstoll;
+  using std::wcstoul;
+  using std::wcstoull;
+  using std::wcsxfrm;
+  using std::wctob;
+  using std::wint_t;
+  using std::wmemchr;
+  using std::wmemcmp;
+  using std::wmemcpy;
+  using std::wmemmove;
+  using std::wmemset;
+  using std::wprintf;
+  using std::wscanf;
+}
+
+// 23.5.2 <cwctype>
+export C_LIB_NAMESPACE
+{
+  using std::iswalnum;
+  using std::iswalpha;
+  using std::iswblank;
+  using std::iswcntrl;
+  using std::iswctype;
+  using std::iswdigit;
+  using std::iswgraph;
+  using std::iswlower;
+  using std::iswprint;
+  using std::iswpunct;
+  using std::iswspace;
+  using std::iswupper;
+  using std::iswxdigit;
+  using std::towctrans;
+  using std::towlower;
+  using std::towupper;
+  using std::wctrans;
+  using std::wctrans_t;
+  using std::wctype;
+  using std::wctype_t;
+  using std::wint_t;
+}
+
+// **** End of C library ****
+
+// 27.4 <algorithm>
+export namespace std
+{
+  namespace ranges
+  {
+    using std::ranges::in_found_result;
+    using std::ranges::in_fun_result;
+    using std::ranges::in_in_out_result;
+    using std::ranges::in_in_result;
+    using std::ranges::in_out_out_result;
+    using std::ranges::in_out_result;
+    using std::ranges::min_max_result;
+  }
+  using std::all_of;
+  namespace ranges
+  {
+    using std::ranges::all_of;
+  }
+  using std::any_of;
+  namespace ranges
+  {
+    using std::ranges::any_of;
+  }
+  using std::none_of;
+  namespace ranges
+  {
+    using std::ranges::none_of;
+  }
+  using std::for_each;
+  namespace ranges
+  {
+    using std::ranges::for_each;
+    using std::ranges::for_each_result;
+  }
+  using std::for_each_n;
+  namespace ranges
+  {
+    using std::ranges::for_each_n;
+    using std::ranges::for_each_n_result;
+  }
+  using std::find;
+  using std::find_if;
+  using std::find_if_not;
+  namespace ranges
+  {
+    using std::ranges::find;
+    using std::ranges::find_if;
+    using std::ranges::find_if_not;
+  }
+  using std::find_end;
+  namespace ranges
+  {
+    using std::ranges::find_end;
+  }
+  using std::find_first_of;
+  namespace ranges
+  {
+    using std::ranges::find_first_of;
+  }
+  using std::adjacent_find;
+  namespace ranges
+  {
+    using std::ranges::adjacent_find;
+  }
+  using std::count;
+  using std::count_if;
+  namespace ranges
+  {
+    using std::ranges::count;
+    using std::ranges::count_if;
+  }
+  using std::mismatch;
+  namespace ranges
+  {
+    using std::ranges::mismatch;
+    using std::ranges::mismatch_result;
+  }
+  using std::equal;
+  namespace ranges
+  {
+    using std::ranges::equal;
+  }
+  using std::is_permutation;
+  namespace ranges
+  {
+    using std::ranges::is_permutation;
+  }
+  using std::search;
+  namespace ranges
+  {
+    using std::ranges::search;
+  }
+  using std::search_n;
+  namespace ranges
+  {
+    using std::ranges::search_n;
+  }
+  namespace ranges
+  {}
+  using std::copy;
+  namespace ranges
+  {
+    using std::ranges::copy;
+    using std::ranges::copy_result;
+  }
+  using std::copy_n;
+  namespace ranges
+  {
+    using std::ranges::copy_n;
+    using std::ranges::copy_n_result;
+  }
+  using std::copy_if;
+  namespace ranges
+  {
+    using std::ranges::copy_if;
+    using std::ranges::copy_if_result;
+  }
+  using std::copy_backward;
+  namespace ranges
+  {
+    using std::ranges::copy_backward;
+    using std::ranges::copy_backward_result;
+  }
+  using std::move;
+  namespace ranges
+  {
+    using std::ranges::move;
+    using std::ranges::move_result;
+  }
+  using std::move_backward;
+  namespace ranges
+  {
+    using std::ranges::move_backward;
+    using std::ranges::move_backward_result;
+  }
+  using std::swap_ranges;
+  namespace ranges
+  {
+    using std::ranges::swap_ranges;
+    using std::ranges::swap_ranges_result;
+  }
+  using std::iter_swap;
+  using std::transform;
+  namespace ranges
+  {
+    using std::ranges::binary_transform_result;
+    using std::ranges::transform;
+    using std::ranges::unary_transform_result;
+  }
+  using std::replace;
+  using std::replace_if;
+  namespace ranges
+  {
+    using std::ranges::replace;
+    using std::ranges::replace_if;
+  }
+  using std::replace_copy;
+  using std::replace_copy_if;
+  namespace ranges
+  {
+    using std::ranges::replace_copy;
+    using std::ranges::replace_copy_if;
+    using std::ranges::replace_copy_if_result;
+    using std::ranges::replace_copy_result;
+  }
+  using std::fill;
+  using std::fill_n;
+  namespace ranges
+  {
+    using std::ranges::fill;
+    using std::ranges::fill_n;
+  }
+  using std::generate;
+  using std::generate_n;
+  namespace ranges
+  {
+    using std::ranges::generate;
+    using std::ranges::generate_n;
+  }
+  using std::remove;
+  using std::remove_if;
+  namespace ranges
+  {
+    using std::ranges::remove;
+    using std::ranges::remove_if;
+  }
+  using std::remove_copy;
+  using std::remove_copy_if;
+  namespace ranges
+  {
+    using std::ranges::remove_copy;
+    using std::ranges::remove_copy_if;
+    using std::ranges::remove_copy_if_result;
+    using std::ranges::remove_copy_result;
+  }
+  using std::unique;
+  namespace ranges
+  {
+    using std::ranges::unique;
+  }
+  using std::unique_copy;
+  namespace ranges
+  {
+    using std::ranges::unique_copy;
+    using std::ranges::unique_copy_result;
+  }
+  using std::reverse;
+  namespace ranges
+  {
+    using std::ranges::reverse;
+  }
+  using std::reverse_copy;
+  namespace ranges
+  {
+    using std::ranges::reverse_copy;
+    using std::ranges::reverse_copy_result;
+  }
+  using std::rotate;
+  namespace ranges
+  {
+    using std::ranges::rotate;
+  }
+  using std::rotate_copy;
+  namespace ranges
+  {
+    using std::ranges::rotate_copy;
+    using std::ranges::rotate_copy_result;
+  }
+  using std::sample;
+  namespace ranges
+  {
+    using std::ranges::sample;
+  }
+  using std::shuffle;
+  namespace ranges
+  {
+    using std::ranges::shuffle;
+  }
+  using std::shift_left;
+  namespace ranges
+  {}
+  using std::shift_right;
+  namespace ranges
+  {}
+  using std::sort;
+  namespace ranges
+  {
+    using std::ranges::sort;
+  }
+  using std::stable_sort;
+  namespace ranges
+  {
+    using std::ranges::stable_sort;
+  }
+  using std::partial_sort;
+  namespace ranges
+  {
+    using std::ranges::partial_sort;
+  }
+  using std::partial_sort_copy;
+  namespace ranges
+  {
+    using std::ranges::partial_sort_copy;
+    using std::ranges::partial_sort_copy_result;
+  }
+  using std::is_sorted;
+  using std::is_sorted_until;
+  namespace ranges
+  {
+    using std::ranges::is_sorted;
+    using std::ranges::is_sorted_until;
+  }
+  using std::nth_element;
+  namespace ranges
+  {
+    using std::ranges::nth_element;
+  }
+  using std::lower_bound;
+  namespace ranges
+  {
+    using std::ranges::lower_bound;
+  }
+  using std::upper_bound;
+  namespace ranges
+  {
+    using std::ranges::upper_bound;
+  }
+  using std::equal_range;
+  namespace ranges
+  {
+    using std::ranges::equal_range;
+  }
+  using std::binary_search;
+  namespace ranges
+  {
+    using std::ranges::binary_search;
+  }
+  using std::is_partitioned;
+  namespace ranges
+  {
+    using std::ranges::is_partitioned;
+  }
+  using std::partition;
+  namespace ranges
+  {
+    using std::ranges::partition;
+  }
+  using std::stable_partition;
+  namespace ranges
+  {
+    using std::ranges::stable_partition;
+  }
+  using std::partition_copy;
+  namespace ranges
+  {
+    using std::ranges::partition_copy;
+    using std::ranges::partition_copy_result;
+  }
+  using std::partition_point;
+  namespace ranges
+  {
+    using std::ranges::partition_point;
+  }
+  using std::merge;
+  namespace ranges
+  {
+    using std::ranges::merge;
+    using std::ranges::merge_result;
+  }
+  using std::inplace_merge;
+  namespace ranges
+  {
+    using std::ranges::inplace_merge;
+  }
+  using std::includes;
+  namespace ranges
+  {
+    using std::ranges::includes;
+  }
+  using std::set_union;
+  namespace ranges
+  {
+    using std::ranges::set_union;
+    using std::ranges::set_union_result;
+  }
+  using std::set_intersection;
+  namespace ranges
+  {
+    using std::ranges::set_intersection;
+    using std::ranges::set_intersection_result;
+  }
+  using std::set_difference;
+  namespace ranges
+  {
+    using std::ranges::set_difference;
+    using std::ranges::set_difference_result;
+  }
+  using std::set_symmetric_difference;
+  namespace ranges
+  {
+    using std::ranges::set_symmetric_difference;
+    using std::ranges::set_symmetric_difference_result;
+  }
+  using std::push_heap;
+  namespace ranges
+  {
+    using std::ranges::push_heap;
+  }
+  using std::pop_heap;
+  namespace ranges
+  {
+    using std::ranges::pop_heap;
+  }
+  using std::make_heap;
+  namespace ranges
+  {
+    using std::ranges::make_heap;
+  }
+  using std::sort_heap;
+  namespace ranges
+  {
+    using std::ranges::sort_heap;
+  }
+  using std::is_heap;
+  namespace ranges
+  {
+    using std::ranges::is_heap;
+  }
+  using std::is_heap_until;
+  namespace ranges
+  {
+    using std::ranges::is_heap_until;
+  }
+  using std::min;
+  namespace ranges
+  {
+    using std::ranges::min;
+  }
+  using std::max;
+  namespace ranges
+  {
+    using std::ranges::max;
+  }
+  using std::minmax;
+  namespace ranges
+  {
+    using std::ranges::minmax;
+    using std::ranges::minmax_result;
+  }
+  using std::min_element;
+  namespace ranges
+  {
+    using std::ranges::min_element;
+  }
+  using std::max_element;
+  namespace ranges
+  {
+    using std::ranges::max_element;
+  }
+  using std::minmax_element;
+  namespace ranges
+  {
+    using std::ranges::minmax_element;
+    using std::ranges::minmax_element_result;
+  }
+  using std::clamp;
+  namespace ranges
+  {
+    using std::ranges::clamp;
+  }
+  using std::lexicographical_compare;
+  namespace ranges
+  {
+    using std::ranges::lexicographical_compare;
+  }
+  using std::lexicographical_compare_three_way;
+  using std::next_permutation;
+  namespace ranges
+  {
+    using std::ranges::next_permutation;
+    using std::ranges::next_permutation_result;
+  }
+  using std::prev_permutation;
+  namespace ranges
+  {
+    using std::ranges::prev_permutation;
+    using std::ranges::prev_permutation_result;
+  }
+}
+
+// 22.7.2 <any>
+#if __cpp_lib_any
+export namespace std
+{
+  using std::any;
+  using std::any_cast;
+  using std::bad_any_cast;
+  using std::make_any;
+  using std::swap;
+}
+#endif
+
+// 24.3.2 <array>
+export namespace std
+{
+  using std::array;
+  using std::operator==;
+  using std::operator<=>;
+  using std::get;
+  using std::swap;
+  using std::to_array;
+  using std::tuple_element;
+  using std::tuple_size;
+}
+
+// 33.5.2 <atomic>
+export namespace std
+{
+  using std::atomic;
+  using std::atomic_bool;
+  using std::atomic_char;
+  using std::atomic_char16_t;
+  using std::atomic_char32_t;
+  using std::atomic_char8_t;
+  using std::atomic_compare_exchange_strong;
+  using std::atomic_compare_exchange_strong_explicit;
+  using std::atomic_compare_exchange_weak;
+  using std::atomic_compare_exchange_weak_explicit;
+  using std::atomic_exchange;
+  using std::atomic_exchange_explicit;
+  using std::atomic_fetch_add;
+  using std::atomic_fetch_add_explicit;
+  using std::atomic_fetch_and;
+  using std::atomic_fetch_and_explicit;
+  using std::atomic_fetch_or;
+  using std::atomic_fetch_or_explicit;
+  using std::atomic_fetch_sub;
+  using std::atomic_fetch_sub_explicit;
+  using std::atomic_fetch_xor;
+  using std::atomic_fetch_xor_explicit;
+  using std::atomic_flag;
+  using std::atomic_flag_clear;
+  using std::atomic_flag_clear_explicit;
+  using std::atomic_flag_notify_all;
+  using std::atomic_flag_notify_one;
+  using std::atomic_flag_test;
+  using std::atomic_flag_test_and_set;
+  using std::atomic_flag_test_and_set_explicit;
+  using std::atomic_flag_test_explicit;
+  using std::atomic_flag_wait;
+  using std::atomic_flag_wait_explicit;
+  using std::atomic_init;
+  using std::atomic_int;
+  using std::atomic_int16_t;
+  using std::atomic_int32_t;
+  using std::atomic_int64_t;
+  using std::atomic_int8_t;
+  using std::atomic_int_fast16_t;
+  using std::atomic_int_fast32_t;
+  using std::atomic_int_fast64_t;
+  using std::atomic_int_fast8_t;
+  using std::atomic_int_least16_t;
+  using std::atomic_int_least32_t;
+  using std::atomic_int_least64_t;
+  using std::atomic_int_least8_t;
+  using std::atomic_intmax_t;
+  using std::atomic_intptr_t;
+  using std::atomic_is_lock_free;
+  using std::atomic_llong;
+  using std::atomic_load;
+  using std::atomic_load_explicit;
+  using std::atomic_long;
+  using std::atomic_notify_all;
+  using std::atomic_notify_one;
+  using std::atomic_ptrdiff_t;
+  using std::atomic_schar;
+  using std::atomic_short;
+  using std::atomic_signal_fence;
+  using std::atomic_signed_lock_free;
+  using std::atomic_size_t;
+  using std::atomic_store;
+  using std::atomic_store_explicit;
+  using std::atomic_thread_fence;
+  using std::atomic_uchar;
+  using std::atomic_uint;
+  using std::atomic_uint16_t;
+  using std::atomic_uint32_t;
+  using std::atomic_uint64_t;
+  using std::atomic_uint8_t;
+  using std::atomic_uint_fast16_t;
+  using std::atomic_uint_fast32_t;
+  using std::atomic_uint_fast64_t;
+  using std::atomic_uint_fast8_t;
+  using std::atomic_uint_least16_t;
+  using std::atomic_uint_least32_t;
+  using std::atomic_uint_least64_t;
+  using std::atomic_uint_least8_t;
+  using std::atomic_uintmax_t;
+  using std::atomic_uintptr_t;
+  using std::atomic_ullong;
+  using std::atomic_ulong;
+  using std::atomic_unsigned_lock_free;
+  using std::atomic_ushort;
+  using std::atomic_wait;
+  using std::atomic_wait_explicit;
+  using std::atomic_wchar_t;
+  using std::kill_dependency;
+  using std::memory_order;
+  using std::memory_order_acq_rel;
+  using std::memory_order_acquire;
+  using std::memory_order_consume;
+  using std::memory_order_relaxed;
+  using std::memory_order_release;
+  using std::memory_order_seq_cst;
+  // ATOMIC_*_LOCK_FREE not exported
+}
+
+// 33.9.3 <barrier>
+#if __cpp_lib_barrier
+export namespace std
+{
+  using std::barrier;
+}
+#endif
+
+// 22.15 <bit>
+export namespace std
+{
+  using std::bit_cast;
+  using std::bit_ceil;
+  using std::bit_floor;
+  using std::bit_width;
+  using std::countl_one;
+  using std::countl_zero;
+  using std::countr_one;
+  using std::countr_zero;
+  using std::endian;
+  using std::has_single_bit;
+  using std::popcount;
+  using std::rotl;
+  using std::rotr;
+}
+
+// 22.9 <bitset>
+#if __cpp_lib_bitset
+export namespace std
+{
+  using std::bitset;
+  using std::operator&;
+  using std::operator|;
+  using std::operator^;
+  using std::operator>>;
+  using std::operator<<;
+  using std::hash;
+}
+#endif
+
+// 22.13 <charconv>
+export namespace std
+{
+  using std::chars_format;
+  using std::operator&;
+  using std::operator&=;
+  using std::operator^;
+  using std::operator^=;
+  using std::operator|;
+  using std::operator|=;
+  using std::operator~;
+  using std::from_chars;
+  using std::from_chars_result;
+  using std::to_chars;
+  using std::to_chars_result;
+}
+
+// 29.2 <chrono>
+#if __cpp_lib_chrono
+export namespace std
+{
+  namespace chrono
+  {
+    using std::chrono::duration;
+    using std::chrono::time_point;
+  }
+  using std::common_type;
+  namespace chrono
+  {
+    using std::chrono::duration_values;
+    using std::chrono::treat_as_floating_point;
+    using std::chrono::treat_as_floating_point_v;
+    using std::chrono::operator+;
+    using std::chrono::operator-;
+    using std::chrono::operator*;
+    using std::chrono::operator/;
+    using std::chrono::operator%;
+    using std::chrono::operator==;
+    using std::chrono::operator<;
+    using std::chrono::operator>;
+    using std::chrono::operator<=;
+    using std::chrono::operator>=;
+    using std::chrono::operator<=>;
+    using std::chrono::ceil;
+    using std::chrono::duration_cast;
+    using std::chrono::floor;
+    using std::chrono::round;
+    using std::chrono::operator<<;
+    using std::chrono::abs;
+    using std::chrono::day;
+    using std::chrono::days;
+    using std::chrono::file_clock;
+    using std::chrono::file_time;
+    using std::chrono::hh_mm_ss;
+    using std::chrono::high_resolution_clock;
+    using std::chrono::hours;
+    using std::chrono::is_am;
+    using std::chrono::is_pm;
+    using std::chrono::last_spec;
+    using std::chrono::local_days;
+    using std::chrono::local_seconds;
+    using std::chrono::local_t;
+    using std::chrono::local_time;
+    using std::chrono::make12;
+    using std::chrono::make24;
+    using std::chrono::microseconds;
+    using std::chrono::milliseconds;
+    using std::chrono::minutes;
+    using std::chrono::month;
+    using std::chrono::month_day;
+    using std::chrono::month_day_last;
+    using std::chrono::month_weekday;
+    using std::chrono::month_weekday_last;
+    using std::chrono::months;
+    using std::chrono::nanoseconds;
+    using std::chrono::seconds;
+    using std::chrono::steady_clock;
+    using std::chrono::sys_days;
+    using std::chrono::sys_seconds;
+    using std::chrono::sys_time;
+    using std::chrono::system_clock;
+    using std::chrono::time_point_cast;
+    using std::chrono::weekday;
+    using std::chrono::weekday_indexed;
+    using std::chrono::weekday_last;
+    using std::chrono::weeks;
+    using std::chrono::year;
+    using std::chrono::year_month;
+    using std::chrono::year_month_day;
+    using std::chrono::year_month_day_last;
+    using std::chrono::year_month_weekday;
+    using std::chrono::year_month_weekday_last;
+    using std::chrono::years;
+  }
+  using std::formatter;
+  namespace chrono
+  {
+    using std::chrono::April;
+    using std::chrono::August;
+    using std::chrono::December;
+    using std::chrono::February;
+    using std::chrono::Friday;
+    using std::chrono::January;
+    using std::chrono::July;
+    using std::chrono::June;
+    using std::chrono::last;
+    using std::chrono::March;
+    using std::chrono::May;
+    using std::chrono::Monday;
+    using std::chrono::November;
+    using std::chrono::October;
+    using std::chrono::Saturday;
+    using std::chrono::September;
+    using std::chrono::Sunday;
+    using std::chrono::Thursday;
+    using std::chrono::Tuesday;
+    using std::chrono::Wednesday;
+  }
+}
+export namespace std::inline literals::inline chrono_literals
+{
+  using std::literals::chrono_literals::operator""h;
+  using std::literals::chrono_literals::operator""min;
+  using std::literals::chrono_literals::operator""s;
+  using std::literals::chrono_literals::operator""ms;
+  using std::literals::chrono_literals::operator""us;
+  using std::literals::chrono_literals::operator""ns;
+  using std::literals::chrono_literals::operator""d;
+  using std::literals::chrono_literals::operator""y;
+}
+#endif // __cpp_lib_chrono
+
+// <codecvt>: deprecated C++17, removed C++26
+export namespace std
+{
+  using std::codecvt_mode;
+  using std::codecvt_utf16;
+  using std::codecvt_utf8;
+  using std::codecvt_utf8_utf16;
+}
+
+// 17.11.1 <compare>
+#if __cpp_lib_three_way_comparison
+export namespace std
+{
+  using std::common_comparison_category;
+  using std::common_comparison_category_t;
+  using std::compare_three_way;
+  using std::compare_three_way_result;
+  using std::compare_three_way_result_t;
+  using std::is_eq;
+  using std::is_gt;
+  using std::is_gteq;
+  using std::is_lt;
+  using std::is_lteq;
+  using std::is_neq;
+  using std::partial_ordering;
+  using std::strong_ordering;
+  using std::three_way_comparable;
+  using std::three_way_comparable_with;
+  using std::weak_ordering;
+  using std::compare_partial_order_fallback;
+  using std::compare_strong_order_fallback;
+  using std::compare_weak_order_fallback;
+  using std::partial_order;
+  using std::strong_order;
+  using std::weak_order;
+}
+#endif // __cpp_lib_three_way_comparison
+
+// 28.4 <complex>
+export namespace std
+{
+  using std::complex;
+  using std::operator+;
+  using std::operator-;
+  using std::operator*;
+  using std::operator/;
+  using std::operator==;
+  using std::operator>>;
+  using std::operator<<;
+  using std::abs;
+  using std::acos;
+  using std::acosh;
+  using std::arg;
+  using std::asin;
+  using std::asinh;
+  using std::atan;
+  using std::atanh;
+  using std::conj;
+  using std::cos;
+  using std::cosh;
+  using std::exp;
+  using std::imag;
+  using std::log;
+  using std::log10;
+  using std::norm;
+  using std::polar;
+  using std::pow;
+  using std::proj;
+  using std::real;
+  using std::sin;
+  using std::sinh;
+  using std::sqrt;
+  using std::tan;
+  using std::tanh;
+  using std::operator""il;
+  using std::operator""i;
+  using std::operator""if;
+}
+
+// 18 <concepts>
+#if __cpp_lib_concepts
+export namespace std
+{
+  using std::assignable_from;
+  using std::common_reference_with;
+  using std::common_with;
+  using std::convertible_to;
+  using std::derived_from;
+  using std::floating_point;
+  using std::integral;
+  using std::same_as;
+  using std::signed_integral;
+  using std::unsigned_integral;
+  namespace ranges
+  {
+    using std::ranges::swap;
+  }
+  using std::constructible_from;
+  using std::copy_constructible;
+  using std::copyable;
+  using std::default_initializable;
+  using std::destructible;
+  using std::equality_comparable;
+  using std::equality_comparable_with;
+  using std::equivalence_relation;
+  using std::invocable;
+  using std::movable;
+  using std::move_constructible;
+  using std::predicate;
+  using std::regular;
+  using std::regular_invocable;
+  using std::relation;
+  using std::semiregular;
+  using std::strict_weak_order;
+  using std::swappable;
+  using std::swappable_with;
+  using std::totally_ordered;
+  using std::totally_ordered_with;
+}
+#endif
+
+// 33.7 <condition_variable>
+export namespace std
+{
+  using std::condition_variable;
+  using std::condition_variable_any;
+  using std::cv_status;
+  using std::notify_all_at_thread_exit;
+}
+
+// 17.12.2 <coroutine>
+#if __cpp_lib_coroutine
+export namespace std
+{
+  using std::coroutine_handle;
+  using std::coroutine_traits;
+  using std::operator==;
+  using std::operator<=>;
+  using std::hash;
+  using std::noop_coroutine;
+  using std::noop_coroutine_handle;
+  using std::noop_coroutine_promise;
+  using std::suspend_always;
+  using std::suspend_never;
+}
+#endif // __cpp_lib_coroutine
+
+// 22.16 <debugging>
+#if __cpp_lib_debugging
+export namespace std
+{
+  using std::breakpoint;
+  using std::breakpoint_if_debugging;
+  using std::is_debugger_present;
+}
+#endif
+
+// 24.3 <deque>
+export namespace std
+{
+  using std::deque;
+  using std::operator==;
+  using std::operator<=>;
+  using std::erase;
+  using std::erase_if;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::deque;
+  }
+}
+
+// 17.9.2 <exception>
+export namespace std
+{
+  using std::bad_exception;
+  using std::current_exception;
+  using std::exception;
+  using std::exception_ptr;
+  using std::get_terminate;
+  using std::make_exception_ptr;
+  using std::nested_exception;
+  using std::rethrow_exception;
+  using std::rethrow_if_nested;
+  using std::set_terminate;
+  using std::terminate;
+  using std::terminate_handler;
+  using std::throw_with_nested;
+  using std::uncaught_exception;
+  using std::uncaught_exceptions;
+}
+
+// 34.4 <execution>
+#if __cpp_lib_execution
+export namespace std
+{
+  using std::is_execution_policy;
+  using std::is_execution_policy_v;
+  namespace execution
+  {
+    using std::execution::sequenced_policy;
+    using std::execution::parallel_policy;
+    using std::execution::parallel_unsequenced_policy;
+    using std::execution::unsequenced_policy;
+    using std::execution::seq;
+    using std::execution::par;
+    using std::execution::par_unseq;
+    using std::execution::unseq;
+  }
+#if __cpp_lib_senders
+  using std::forwarding_query_t;
+  using std::get_allocator_t;
+  using std::get_stop_token_t;
+  using std::forwarding_query;
+  using std::get_allocator;
+  using std::get_stop_token;
+  using std::stop_token_of_t;
+  namespace execution
+  {
+    using std::execution::get_domain_t;
+    using std::execution::get_scheduler_t;
+    using std::execution::get_delegation_scheduler_t;
+    using std::execution::get_forward_progress_guarantee_t;
+    using std::execution::get_completion_scheduler_t;
+    using std::execution::get_domain;
+    using std::execution::get_scheduler;
+    using std::execution::get_delegation_scheduler;
+    using std::execution::forward_progress_guarantee;
+    using std::execution::get_forward_progress_guarantee;
+    using std::execution::get_completion_scheduler;
+    using std::execution::empty_env;
+    using std::execution::get_env_t;
+    using std::execution::get_env;
+    using std::execution::env_of_t;
+    using std::execution::default_domain;
+    using std::execution::scheduler_t;
+    using std::execution::scheduler;
+    using std::execution::receiver_t;
+    using std::execution::receiver;
+    using std::execution::receiver_of;
+    using std::execution::set_value_t;
+    using std::execution::set_error_t;
+    using std::execution::set_stopped_t;
+    using std::execution::set_value;
+    using std::execution::set_error;
+    using std::execution::set_stopped;
+    using std::execution::operation_state_t;
+    using std::execution::operation_state;
+    using std::execution::start_t;
+    using std::execution::start;
+    using std::execution::sender_t;
+    using std::execution::sender;
+    using std::execution::sender_in;
+    using std::execution::sender_to;
+    using std::execution::get_completion_signatures_t;
+    using std::execution::get_completion_signatures;
+    using std::execution::completion_signatures_of_t;
+    using std::execution::value_types_of_t;
+    using std::execution::error_types_of_t;
+    using std::execution::sends_stopped;
+    using std::execution::tag_of_t;
+    using std::execution::transform_sender;
+    using std::execution::transform_env;
+    using std::execution::apply_sender;
+    using std::execution::connect_t;
+    using std::execution::connect;
+    using std::execution::connect_result_t;
+    using std::execution::just_t;
+    using std::execution::just_error_t;
+    using std::execution::just_stopped_t;
+    using std::execution::schedule_t;
+    using std::execution::just;
+    using std::execution::just_error;
+    using std::execution::just_stopped;
+    using std::execution::schedule;
+    using std::execution::read_env;
+    using std::execution::schedule_result_t;
+    using std::execution::sender_adaptor_closure;
+    using std::execution::starts_on_t;
+    using std::execution::continues_on_t;
+    using std::execution::on_t;
+    using std::execution::schedule_from_t;
+    using std::execution::then_t;
+    using std::execution::upon_error_t;
+    using std::execution::upon_stopped_t;
+    using std::execution::let_value_t;
+    using std::execution::let_error_t;
+    using std::execution::let_stopped_t;
+    using std::execution::bulk_t;
+    using std::execution::split_t;
+    using std::execution::when_all_t;
+    using std::execution::when_all_with_variant_t;
+    using std::execution::into_variant_t;
+    using std::execution::stopped_as_optional_t;
+    using std::execution::stopped_as_error_t;
+    using std::execution::starts_on;
+    using std::execution::continues_on;
+    using std::execution::on;
+    using std::execution::schedule_from;
+    using std::execution::then;
+    using std::execution::upon_error;
+    using std::execution::upon_stopped;
+    using std::execution::let_value;
+    using std::execution::let_error;
+    using std::execution::let_stopped;
+    using std::execution::bulk;
+    using std::execution::split;
+    using std::execution::when_all;
+    using std::execution::when_all_with_variant;
+    using std::execution::into_variant;
+    using std::execution::stopped_as_optional;
+    using std::execution::stopped_as_error;
+    using std::execution::completion_signatures;
+    using std::execution::transform_completion_signatures;
+    using std::execution::transform_completion_signatures_of;
+    using std::execution::run_loop;
+  }
+  namespace this_thread
+  {
+    using std::this_thread::sync_wait_t;
+    using std::this_thread::sync_wait_with_variant_t;
+    using std::this_thread::sync_wait;
+    using std::this_thread::sync_wait_with_variant;
+  }
+#endif // __cpp_lib_senders
+}
+#endif // __cpp_lib_execution
+
+// 22.8 <expected>
+#if __cpp_lib_expected
+export namespace std
+{
+  using std::unexpected;
+  using std::bad_expected_access;
+  using std::unexpect_t;
+  using std::unexpect;
+  using std::expected;
+}
+#endif
+
+// <filesystem>
+#if __cpp_lib_filesystem
+export namespace std::filesystem
+{
+  using std::filesystem::begin;
+  using std::filesystem::copy_options;
+  using std::filesystem::directory_entry;
+  using std::filesystem::directory_iterator;
+  using std::filesystem::directory_options;
+  using std::filesystem::end;
+  using std::filesystem::file_status;
+  using std::filesystem::file_time_type;
+  using std::filesystem::file_type;
+  using std::filesystem::filesystem_error;
+  using std::filesystem::hash_value;
+  using std::filesystem::path;
+  using std::filesystem::perm_options;
+  using std::filesystem::perms;
+  using std::filesystem::recursive_directory_iterator;
+  using std::filesystem::space_info;
+  using std::filesystem::swap;
+  using std::filesystem::operator&;
+  using std::filesystem::operator&=;
+  using std::filesystem::operator^;
+  using std::filesystem::operator^=;
+  using std::filesystem::operator|;
+  using std::filesystem::operator|=;
+  using std::filesystem::operator~;
+  using std::filesystem::absolute;
+  using std::filesystem::canonical;
+  using std::filesystem::copy;
+  using std::filesystem::copy_file;
+  using std::filesystem::copy_symlink;
+  using std::filesystem::create_directories;
+  using std::filesystem::create_directory;
+  using std::filesystem::create_directory_symlink;
+  using std::filesystem::create_hard_link;
+  using std::filesystem::create_symlink;
+  using std::filesystem::current_path;
+  using std::filesystem::equivalent;
+  using std::filesystem::exists;
+  using std::filesystem::file_size;
+  using std::filesystem::hard_link_count;
+  using std::filesystem::is_block_file;
+  using std::filesystem::is_character_file;
+  using std::filesystem::is_directory;
+  using std::filesystem::is_empty;
+  using std::filesystem::is_fifo;
+  using std::filesystem::is_other;
+  using std::filesystem::is_regular_file;
+  using std::filesystem::is_socket;
+  using std::filesystem::is_symlink;
+  using std::filesystem::last_write_time;
+  using std::filesystem::permissions;
+  using std::filesystem::proximate;
+  using std::filesystem::read_symlink;
+  using std::filesystem::relative;
+  using std::filesystem::remove;
+  using std::filesystem::remove_all;
+  using std::filesystem::rename;
+  using std::filesystem::resize_file;
+  using std::filesystem::space;
+  using std::filesystem::status;
+  using std::filesystem::status_known;
+  using std::filesystem::symlink_status;
+  using std::filesystem::temp_directory_path;
+  using std::filesystem::u8path;
+  using std::filesystem::weakly_canonical;
+}
+#endif // __cpp_lib_filesystem
+
+// <flat_map>
+
+// <flat_set>
+
+// <format>
+export namespace std
+{
+  using std::basic_format_arg;
+  using std::basic_format_args;
+  using std::basic_format_context;
+  using std::basic_format_parse_context;
+  using std::basic_format_string;
+  using std::format;
+  using std::format_args;
+  using std::format_context;
+  using std::format_error;
+  using std::format_parse_context;
+  using std::format_string;
+  using std::format_to;
+  using std::format_to_n;
+  using std::format_to_n_result;
+  using std::formatted_size;
+  using std::formatter;
+  using std::make_format_args;
+  using std::make_wformat_args;
+  using std::vformat;
+  using std::vformat_to;
+  using std::visit_format_arg;
+  using std::wformat_args;
+  using std::wformat_context;
+  using std::wformat_parse_context;
+  using std::wformat_string;
+}
+
+// <forward_list>
+export namespace std
+{
+  using std::forward_list;
+  using std::operator==;
+  using std::operator<=>;
+  using std::erase;
+  using std::erase_if;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::forward_list;
+  }
+}
+
+// <fstream>
+export namespace std
+{
+  using std::basic_filebuf;
+  using std::basic_fstream;
+  using std::basic_ifstream;
+  using std::basic_ofstream;
+  using std::filebuf;
+  using std::fstream;
+  using std::ifstream;
+  using std::ofstream;
+  using std::swap;
+  using std::wfilebuf;
+  using std::wfstream;
+  using std::wifstream;
+  using std::wofstream;
+}
+
+// <functional>
+export namespace std
+{
+  using std::bind;
+  using std::bind_front;
+  using std::bit_and;
+  using std::bit_not;
+  using std::bit_or;
+  using std::bit_xor;
+  using std::compare_three_way;
+  using std::cref;
+  using std::divides;
+  using std::equal_to;
+  using std::greater;
+  using std::greater_equal;
+  using std::identity;
+  using std::invoke;
+  using std::is_bind_expression;
+  using std::is_bind_expression_v;
+  using std::is_placeholder;
+  using std::is_placeholder_v;
+  using std::less;
+  using std::less_equal;
+  using std::logical_and;
+  using std::logical_not;
+  using std::logical_or;
+  using std::minus;
+  using std::modulus;
+  using std::multiplies;
+  using std::negate;
+  using std::not_equal_to;
+  using std::not_fn;
+  using std::plus;
+  using std::ref;
+  using std::reference_wrapper;
+  namespace placeholders
+  {
+    using std::placeholders::_1;
+    using std::placeholders::_10;
+    using std::placeholders::_2;
+    using std::placeholders::_3;
+    using std::placeholders::_4;
+    using std::placeholders::_5;
+    using std::placeholders::_6;
+    using std::placeholders::_7;
+    using std::placeholders::_8;
+    using std::placeholders::_9;
+  }
+  using std::bad_function_call;
+  using std::function;
+  using std::mem_fn;
+  using std::swap;
+  using std::operator==;
+  using std::boyer_moore_horspool_searcher;
+  using std::boyer_moore_searcher;
+  using std::default_searcher;
+  using std::hash;
+  namespace ranges
+  {
+    using std::ranges::equal_to;
+    using std::ranges::greater;
+    using std::ranges::greater_equal;
+    using std::ranges::less;
+    using std::ranges::less_equal;
+    using std::ranges::not_equal_to;
+  }
+}
+
+// <future>
+export namespace std
+{
+  using std::future_errc;
+  using std::future_status;
+  using std::launch;
+  using std::operator&;
+  using std::operator&=;
+  using std::operator^;
+  using std::operator^=;
+  using std::operator|;
+  using std::operator|=;
+  using std::operator~;
+  using std::async;
+  using std::future;
+  using std::future_category;
+  using std::future_error;
+  using std::is_error_code_enum;
+  using std::make_error_code;
+  using std::make_error_condition;
+  using std::packaged_task;
+  using std::promise;
+  using std::shared_future;
+  using std::swap;
+  using std::uses_allocator;
+}
+
+// <generator> FIXME
+
+// <hazard_pointer> FIXME
+
+// 17.10.2 <initializer_list>
+export namespace std
+{
+  using std::begin;
+  using std::end;
+  using std::initializer_list;
+}
+
+// <inplace_vector> FIXME
+
+// <iomanip>
+export namespace std
+{
+  using std::get_money;
+  using std::get_time;
+  using std::put_money;
+  using std::put_time;
+  using std::quoted;
+  using std::resetiosflags;
+  using std::setbase;
+  using std::setfill;
+  using std::setiosflags;
+  using std::setprecision;
+  using std::setw;
+}
+
+// <ios>
+export namespace std
+{
+  using std::fpos;
+  using std::operator!=;
+  using std::operator-;
+  using std::operator==;
+  using std::basic_ios;
+  using std::boolalpha;
+  using std::dec;
+  using std::defaultfloat;
+  using std::fixed;
+  using std::hex;
+  using std::hexfloat;
+  using std::internal;
+  using std::io_errc;
+  using std::ios;
+  using std::ios_base;
+  using std::iostream_category;
+  using std::is_error_code_enum;
+  using std::left;
+  using std::make_error_code;
+  using std::make_error_condition;
+  using std::noboolalpha;
+  using std::noshowbase;
+  using std::noshowpoint;
+  using std::noshowpos;
+  using std::noskipws;
+  using std::nounitbuf;
+  using std::nouppercase;
+  using std::oct;
+  using std::right;
+  using std::scientific;
+  using std::showbase;
+  using std::showpoint;
+  using std::showpos;
+  using std::skipws;
+  using std::streamoff;
+  using std::streamsize;
+  using std::unitbuf;
+  using std::uppercase;
+  using std::wios;
+}
+
+// <iosfwd>
+export namespace std
+{
+  using std::streampos;
+  using std::u16streampos;
+  using std::u32streampos;
+  using std::u8streampos;
+  using std::wstreampos;
+  using std::basic_osyncstream;
+  using std::basic_syncbuf;
+  using std::istreambuf_iterator;
+  using std::ostreambuf_iterator;
+  using std::osyncstream;
+  using std::syncbuf;
+  using std::wosyncstream;
+  using std::wsyncbuf;
+  using std::fpos;
+}
+
+// <iostream>
+export namespace std
+{
+  using std::cerr;
+  using std::cin;
+  using std::clog;
+  using std::cout;
+  using std::wcerr;
+  using std::wcin;
+  using std::wclog;
+  using std::wcout;
+}
+
+// <istream>
+export namespace std
+{
+  using std::basic_iostream;
+  using std::basic_istream;
+  using std::iostream;
+  using std::istream;
+  using std::wiostream;
+  using std::wistream;
+  using std::ws;
+  using std::operator>>;
+}
+
+// <iterator>
+export namespace std
+{
+  using std::incrementable_traits;
+  using std::indirectly_readable_traits;
+  using std::iter_difference_t;
+  using std::iter_reference_t;
+  using std::iter_value_t;
+  using std::iterator_traits;
+  namespace ranges
+  {
+    using std::ranges::iter_move;
+    using std::ranges::iter_swap;
+  }
+  using std::advance;
+  using std::bidirectional_iterator;
+  using std::bidirectional_iterator_tag;
+  using std::contiguous_iterator;
+  using std::contiguous_iterator_tag;
+  using std::disable_sized_sentinel_for;
+  using std::distance;
+  using std::forward_iterator;
+  using std::forward_iterator_tag;
+  using std::incrementable;
+  using std::indirect_binary_predicate;
+  using std::indirect_equivalence_relation;
+  using std::indirect_result_t;
+  using std::indirect_strict_weak_order;
+  using std::indirect_unary_predicate;
+  using std::indirectly_comparable;
+  using std::indirectly_copyable;
+  using std::indirectly_copyable_storable;
+  using std::indirectly_movable;
+  using std::indirectly_movable_storable;
+  using std::indirectly_readable;
+  using std::indirectly_regular_unary_invocable;
+  using std::indirectly_swappable;
+  using std::indirectly_unary_invocable;
+  using std::indirectly_writable;
+  using std::input_iterator;
+  using std::input_iterator_tag;
+  using std::input_or_output_iterator;
+  using std::iter_common_reference_t;
+  using std::iter_rvalue_reference_t;
+  using std::mergeable;
+  using std::next;
+  using std::output_iterator;
+  using std::output_iterator_tag;
+  using std::permutable;
+  using std::prev;
+  using std::projected;
+  using std::random_access_iterator;
+  using std::random_access_iterator_tag;
+  using std::sentinel_for;
+  using std::sized_sentinel_for;
+  using std::sortable;
+  using std::weakly_incrementable;
+  namespace ranges
+  {
+    using std::ranges::advance;
+    using std::ranges::distance;
+    using std::ranges::next;
+    using std::ranges::prev;
+  }
+  using std::reverse_iterator;
+  using std::operator==;
+  using std::operator!=;
+  using std::operator<;
+  using std::operator>;
+  using std::operator<=;
+  using std::operator>=;
+  using std::operator<=>;
+  using std::operator-;
+  using std::operator+;
+  using std::back_insert_iterator;
+  using std::back_inserter;
+  using std::begin;
+  using std::cbegin;
+  using std::cend;
+  using std::common_iterator;
+  using std::counted_iterator;
+  using std::crbegin;
+  using std::crend;
+  using std::data;
+  using std::default_sentinel;
+  using std::default_sentinel_t;
+  using std::empty;
+  using std::end;
+  using std::front_insert_iterator;
+  using std::front_inserter;
+  using std::insert_iterator;
+  using std::inserter;
+  using std::istream_iterator;
+  using std::istreambuf_iterator;
+  using std::iterator;
+  using std::make_move_iterator;
+  using std::make_reverse_iterator;
+  using std::move_iterator;
+  using std::move_sentinel;
+  using std::ostream_iterator;
+  using std::ostreambuf_iterator;
+  using std::rbegin;
+  using std::rend;
+  using std::size;
+  using std::ssize;
+  using std::unreachable_sentinel;
+  using std::unreachable_sentinel_t;
+}
+
+// <latch>
+export namespace std
+{
+  using std::latch;
+}
+
+// 17.3.3 <limits> [limits.syn]
+export namespace std
+{
+  using std::float_denorm_style; // deprecated in C++23
+  using std::float_round_style;
+  using std::numeric_limits;
+}
+
+// FIXME <linalg>
+
+// <list>
+export namespace std
+{
+  using std::list;
+  using std::operator==;
+  using std::operator<=>;
+  using std::erase;
+  using std::erase_if;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::list;
+  }
+}
+
+// <locale>
+export namespace std
+{
+  using std::codecvt;
+  using std::codecvt_base;
+  using std::codecvt_byname;
+  using std::collate;
+  using std::collate_byname;
+  using std::ctype;
+  using std::ctype_base;
+  using std::ctype_byname;
+  using std::has_facet;
+  using std::isalnum;
+  using std::isalpha;
+  using std::isblank;
+  using std::iscntrl;
+  using std::isdigit;
+  using std::isgraph;
+  using std::islower;
+  using std::isprint;
+  using std::ispunct;
+  using std::isspace;
+  using std::isupper;
+  using std::isxdigit;
+  using std::locale;
+  using std::messages;
+  using std::messages_base;
+  using std::messages_byname;
+  using std::money_base;
+  using std::money_get;
+  using std::money_put;
+  using std::moneypunct;
+  using std::moneypunct_byname;
+  using std::num_get;
+  using std::num_put;
+  using std::numpunct;
+  using std::numpunct_byname;
+  using std::time_base;
+  using std::time_get;
+  using std::time_get_byname;
+  using std::time_put;
+  using std::time_put_byname;
+  using std::tolower;
+  using std::toupper;
+  using std::use_facet;
+  using std::wbuffer_convert;
+  using std::wstring_convert;
+}
+
+// <map>
+export namespace std
+{
+  using std::map;
+  using std::operator==;
+  using std::operator<=>;
+  using std::erase_if;
+  using std::multimap;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::map;
+    using std::pmr::multimap;
+  }
+}
+
+// FIXME <mdspan>
+
+// 20.2 <memory>
+export namespace std
+{
+  using std::align;
+  using std::allocator;
+  using std::allocator_arg;
+  using std::allocator_arg_t;
+  using std::allocator_traits;
+  using std::assume_aligned;
+  using std::make_obj_using_allocator;
+  using std::pointer_traits;
+  using std::to_address;
+  using std::uninitialized_construct_using_allocator;
+  using std::uses_allocator;
+  using std::uses_allocator_construction_args;
+  using std::uses_allocator_v;
+  using std::operator==;
+  using std::addressof;
+  using std::uninitialized_default_construct;
+  using std::uninitialized_default_construct_n;
+  namespace ranges
+  {
+    using std::ranges::uninitialized_default_construct;
+    using std::ranges::uninitialized_default_construct_n;
+  }
+  using std::uninitialized_value_construct;
+  using std::uninitialized_value_construct_n;
+  namespace ranges
+  {
+    using std::ranges::uninitialized_value_construct;
+    using std::ranges::uninitialized_value_construct_n;
+  }
+  using std::uninitialized_copy;
+  using std::uninitialized_copy_n;
+  namespace ranges
+  {
+    using std::ranges::uninitialized_copy;
+    using std::ranges::uninitialized_copy_n;
+    using std::ranges::uninitialized_copy_n_result;
+    using std::ranges::uninitialized_copy_result;
+  }
+  using std::uninitialized_move;
+  using std::uninitialized_move_n;
+  namespace ranges
+  {
+    using std::ranges::uninitialized_move;
+    using std::ranges::uninitialized_move_n;
+    using std::ranges::uninitialized_move_n_result;
+    using std::ranges::uninitialized_move_result;
+  }
+  using std::uninitialized_fill;
+  using std::uninitialized_fill_n;
+  namespace ranges
+  {
+    using std::ranges::uninitialized_fill;
+    using std::ranges::uninitialized_fill_n;
+  }
+  using std::construct_at;
+  namespace ranges
+  {
+    using std::ranges::construct_at;
+  }
+  using std::destroy;
+  using std::destroy_at;
+  using std::destroy_n;
+  namespace ranges
+  {
+    using std::ranges::destroy;
+    using std::ranges::destroy_at;
+    using std::ranges::destroy_n;
+  }
+  using std::default_delete;
+  using std::make_unique;
+  using std::make_unique_for_overwrite;
+  using std::unique_ptr;
+  using std::operator<;
+  using std::operator>;
+  using std::operator<=;
+  using std::operator>=;
+  using std::operator<=>;
+  using std::operator<<;
+  using std::allocate_shared;
+  using std::allocate_shared_for_overwrite;
+  using std::bad_weak_ptr;
+  using std::const_pointer_cast;
+  using std::dynamic_pointer_cast;
+  using std::make_shared;
+  using std::make_shared_for_overwrite;
+  using std::reinterpret_pointer_cast;
+  using std::shared_ptr;
+  using std::static_pointer_cast;
+  using std::swap;
+  using std::get_deleter;
+  using std::atomic_compare_exchange_strong;
+  using std::atomic_compare_exchange_strong_explicit;
+  using std::atomic_compare_exchange_weak;
+  using std::atomic_compare_exchange_weak_explicit;
+  using std::atomic_exchange;
+  using std::atomic_exchange_explicit;
+  using std::atomic_is_lock_free;
+  using std::atomic_load;
+  using std::atomic_load_explicit;
+  using std::atomic_store;
+  using std::atomic_store_explicit;
+  using std::enable_shared_from_this;
+  using std::hash;
+  using std::owner_less;
+  using std::weak_ptr;
+}
+
+// 20.4 <memory_resource>
+export namespace std::pmr
+{
+  using std::pmr::memory_resource;
+  using std::pmr::operator==;
+  using std::pmr::get_default_resource;
+  using std::pmr::monotonic_buffer_resource;
+  using std::pmr::new_delete_resource;
+  using std::pmr::null_memory_resource;
+  using std::pmr::polymorphic_allocator;
+  using std::pmr::pool_options;
+  using std::pmr::set_default_resource;
+  using std::pmr::synchronized_pool_resource;
+  using std::pmr::unsynchronized_pool_resource;
+}
+
+// <mutex>
+export namespace std
+{
+  using std::adopt_lock;
+  using std::adopt_lock_t;
+  using std::call_once;
+  using std::defer_lock;
+  using std::defer_lock_t;
+  using std::lock;
+  using std::lock_guard;
+  using std::mutex;
+  using std::once_flag;
+  using std::recursive_mutex;
+  using std::recursive_timed_mutex;
+  using std::scoped_lock;
+  using std::swap;
+  using std::timed_mutex;
+  using std::try_lock;
+  using std::try_to_lock;
+  using std::try_to_lock_t;
+  using std::unique_lock;
+}
+
+// 17.6.2 <new> [new.syn]
+export namespace std
+{
+  using std::align_val_t;
+  using std::bad_alloc;
+  using std::bad_array_new_length;
+  using std::destroying_delete;
+  using std::destroying_delete_t;
+  using std::get_new_handler;
+  using std::hardware_destructive_interference_size;
+  using std::hardware_constructive_interference_size;
+  using std::launder;
+  using std::new_handler;
+  using std::nothrow;
+  using std::nothrow_t;
+  using std::set_new_handler;
+}
+export
+{
+  using ::operator new;
+  using ::operator delete;
+  using ::operator new[];
+  using ::operator delete[];
+}
+
+// <numbers>
+export namespace std::numbers
+{
+  using std::numbers::e;
+  using std::numbers::e_v;
+  using std::numbers::egamma;
+  using std::numbers::egamma_v;
+  using std::numbers::inv_pi;
+  using std::numbers::inv_pi_v;
+  using std::numbers::inv_sqrt3;
+  using std::numbers::inv_sqrt3_v;
+  using std::numbers::inv_sqrtpi;
+  using std::numbers::inv_sqrtpi_v;
+  using std::numbers::ln10;
+  using std::numbers::ln10_v;
+  using std::numbers::ln2;
+  using std::numbers::ln2_v;
+  using std::numbers::log10e;
+  using std::numbers::log10e_v;
+  using std::numbers::log2e;
+  using std::numbers::log2e_v;
+  using std::numbers::phi;
+  using std::numbers::phi_v;
+  using std::numbers::pi;
+  using std::numbers::pi_v;
+  using std::numbers::sqrt2;
+  using std::numbers::sqrt2_v;
+  using std::numbers::sqrt3;
+  using std::numbers::sqrt3_v;
+}
+
+// <numeric>
+export namespace std
+{
+  using std::accumulate;
+  using std::adjacent_difference;
+  using std::exclusive_scan;
+  using std::inclusive_scan;
+  using std::inner_product;
+  using std::iota;
+  using std::partial_sum;
+  using std::reduce;
+  using std::transform_exclusive_scan;
+  using std::transform_inclusive_scan;
+  using std::transform_reduce;
+  using std::gcd;
+  using std::lcm;
+  using std::midpoint;
+}
+
+// <optional>
+export namespace std
+{
+  using std::bad_optional_access;
+  using std::nullopt;
+  using std::nullopt_t;
+  using std::optional;
+  using std::operator==;
+  using std::operator!=;
+  using std::operator<;
+  using std::operator>;
+  using std::operator<=;
+  using std::operator>=;
+  using std::operator<=>;
+  using std::hash;
+  using std::make_optional;
+  using std::swap;
+}
+
+// <ostream>
+export namespace std
+{
+  using std::basic_ostream;
+  using std::endl;
+  using std::ends;
+  using std::flush;
+  using std::ostream;
+  using std::wostream;
+  using std::operator<<;
+}
+
+// FIXME <print>
+
+// <queue>
+export namespace std
+{
+  using std::queue;
+  using std::operator==;
+  using std::operator!=;
+  using std::operator<;
+  using std::operator>;
+  using std::operator<=;
+  using std::operator>=;
+  using std::operator<=>;
+  using std::priority_queue;
+  using std::swap;
+  using std::uses_allocator;
+}
+
+// <random>
+export namespace std
+{
+  using std::bernoulli_distribution;
+  using std::binomial_distribution;
+  using std::cauchy_distribution;
+  using std::chi_squared_distribution;
+  using std::default_random_engine;
+  using std::discard_block_engine;
+  using std::discrete_distribution;
+  using std::exponential_distribution;
+  using std::extreme_value_distribution;
+  using std::fisher_f_distribution;
+  using std::gamma_distribution;
+  using std::generate_canonical;
+  using std::geometric_distribution;
+  using std::independent_bits_engine;
+  using std::knuth_b;
+  using std::linear_congruential_engine;
+  using std::lognormal_distribution;
+  using std::mersenne_twister_engine;
+  using std::minstd_rand;
+  using std::minstd_rand0;
+  using std::mt19937;
+  using std::mt19937_64;
+  using std::negative_binomial_distribution;
+  using std::normal_distribution;
+  using std::piecewise_constant_distribution;
+  using std::piecewise_linear_distribution;
+  using std::poisson_distribution;
+  using std::random_device;
+  using std::ranlux24;
+  using std::ranlux24_base;
+  using std::ranlux48;
+  using std::ranlux48_base;
+  using std::seed_seq;
+  using std::shuffle_order_engine;
+  using std::student_t_distribution;
+  using std::subtract_with_carry_engine;
+  using std::uniform_int_distribution;
+  using std::uniform_random_bit_generator;
+  using std::uniform_real_distribution;
+  using std::weibull_distribution;
+}
+
+// <ranges>
+export namespace std
+{
+  namespace ranges
+  {
+    using std::ranges::begin;
+    using std::ranges::cbegin;
+    using std::ranges::cdata;
+    using std::ranges::cend;
+    using std::ranges::crbegin;
+    using std::ranges::crend;
+    using std::ranges::data;
+    using std::ranges::empty;
+    using std::ranges::end;
+    using std::ranges::rbegin;
+    using std::ranges::rend;
+    using std::ranges::size;
+    using std::ranges::ssize;
+    using std::ranges::bidirectional_range;
+    using std::ranges::borrowed_range;
+    using std::ranges::common_range;
+    using std::ranges::contiguous_range;
+    using std::ranges::disable_sized_range;
+    using std::ranges::enable_borrowed_range;
+    using std::ranges::enable_view;
+    using std::ranges::forward_range;
+    using std::ranges::get;
+    using std::ranges::input_range;
+    using std::ranges::iterator_t;
+    using std::ranges::output_range;
+    using std::ranges::random_access_range;
+    using std::ranges::range;
+    using std::ranges::range_common_reference_t;
+    using std::ranges::range_difference_t;
+    using std::ranges::range_reference_t;
+    using std::ranges::range_rvalue_reference_t;
+    using std::ranges::range_size_t;
+    using std::ranges::range_value_t;
+    using std::ranges::sentinel_t;
+    using std::ranges::sized_range;
+    using std::ranges::subrange;
+    using std::ranges::subrange_kind;
+    using std::ranges::view;
+    using std::ranges::view_base;
+    using std::ranges::view_interface;
+    using std::ranges::viewable_range;
+  }
+  using std::ranges::get;
+  namespace ranges
+  {
+    using std::ranges::borrowed_iterator_t;
+    using std::ranges::borrowed_subrange_t;
+    using std::ranges::dangling;
+    using std::ranges::empty_view;
+    namespace views
+    {
+      using std::ranges::views::empty;
+    }
+    using std::ranges::single_view;
+    namespace views
+    {
+      using std::ranges::views::single;
+    }
+    using std::ranges::iota_view;
+    namespace views
+    {
+      using std::ranges::views::iota;
+    }
+    using std::ranges::basic_istream_view;
+    using std::ranges::istream_view;
+    using std::ranges::wistream_view;
+    namespace views
+    {
+      using std::ranges::views::istream;
+    }
+    namespace views
+    {
+      using std::ranges::views::all;
+      using std::ranges::views::all_t;
+    }
+    using std::ranges::filter_view;
+    using std::ranges::owning_view;
+    using std::ranges::ref_view;
+    namespace views
+    {
+      using std::ranges::views::filter;
+    }
+    using std::ranges::transform_view;
+    namespace views
+    {
+      using std::ranges::views::transform;
+    }
+    using std::ranges::take_view;
+    namespace views
+    {
+      using std::ranges::views::take;
+    }
+    using std::ranges::take_while_view;
+    namespace views
+    {
+      using std::ranges::views::take_while;
+    }
+    using std::ranges::drop_view;
+    namespace views
+    {
+      using std::ranges::views::drop;
+    }
+    using std::ranges::drop_while_view;
+    namespace views
+    {
+      using std::ranges::views::drop_while;
+    }
+    using std::ranges::join_view;
+    namespace views
+    {
+      using std::ranges::views::join;
+    }
+    using std::ranges::lazy_split_view;
+    using std::ranges::split_view;
+    namespace views
+    {
+      using std::ranges::views::lazy_split;
+      using std::ranges::views::split;
+    }
+    namespace views
+    {
+      using std::ranges::views::counted;
+    }
+    using std::ranges::common_view;
+    namespace views
+    {
+      using std::ranges::views::common;
+    }
+    using std::ranges::reverse_view;
+    namespace views
+    {
+      using std::ranges::views::reverse;
+    }
+    using std::ranges::elements_view;
+    using std::ranges::keys_view;
+    using std::ranges::values_view;
+    namespace views
+    {
+      using std::ranges::views::elements;
+      using std::ranges::views::keys;
+      using std::ranges::views::values;
+    }
+  }
+  namespace views = ranges::views;
+  using std::tuple_element;
+  using std::tuple_size;
+}
+
+// <ratio>
+export namespace std
+{
+  using std::atto;
+  using std::centi;
+  using std::deca;
+  using std::deci;
+  using std::exa;
+  using std::femto;
+  using std::giga;
+  using std::hecto;
+  using std::kilo;
+  using std::mega;
+  using std::micro;
+  using std::milli;
+  using std::nano;
+  using std::peta;
+  using std::pico;
+  using std::ratio;
+  using std::ratio_add;
+  using std::ratio_divide;
+  using std::ratio_equal;
+  using std::ratio_equal_v;
+  using std::ratio_greater;
+  using std::ratio_greater_equal;
+  using std::ratio_greater_equal_v;
+  using std::ratio_greater_v;
+  using std::ratio_less;
+  using std::ratio_less_equal;
+  using std::ratio_less_equal_v;
+  using std::ratio_less_v;
+  using std::ratio_multiply;
+  using std::ratio_not_equal;
+  using std::ratio_not_equal_v;
+  using std::ratio_subtract;
+  using std::tera;
+}
+
+// FIXME <rcu>
+
+// <regex>
+export namespace std
+{
+  namespace regex_constants
+  {
+    using std::regex_constants::error_type;
+    using std::regex_constants::match_flag_type;
+    using std::regex_constants::syntax_option_type;
+    using std::regex_constants::operator&;
+    using std::regex_constants::operator&=;
+    using std::regex_constants::operator^;
+    using std::regex_constants::operator^=;
+    using std::regex_constants::operator|;
+    using std::regex_constants::operator|=;
+    using std::regex_constants::operator~;
+  }
+  using std::basic_regex;
+  using std::csub_match;
+  using std::regex;
+  using std::regex_error;
+  using std::regex_traits;
+  using std::ssub_match;
+  using std::sub_match;
+  using std::swap;
+  using std::wcsub_match;
+  using std::wregex;
+  using std::wssub_match;
+  using std::operator==;
+  using std::operator<=>;
+  using std::operator<<;
+  using std::cmatch;
+  using std::cregex_iterator;
+  using std::cregex_token_iterator;
+  using std::match_results;
+  using std::regex_iterator;
+  using std::regex_match;
+  using std::regex_replace;
+  using std::regex_search;
+  using std::regex_token_iterator;
+  using std::smatch;
+  using std::sregex_iterator;
+  using std::sregex_token_iterator;
+  using std::wcmatch;
+  using std::wcregex_iterator;
+  using std::wcregex_token_iterator;
+  using std::wsmatch;
+  using std::wsregex_iterator;
+  using std::wsregex_token_iterator;
+  namespace pmr
+  {
+    using std::pmr::cmatch;
+    using std::pmr::match_results;
+    using std::pmr::smatch;
+    using std::pmr::wcmatch;
+    using std::pmr::wsmatch;
+  }
+}
+
+// 20.5 <scoped_allocator>
+export namespace std
+{
+  using std::scoped_allocator_adaptor;
+  using std::operator==;
+}
+
+// <semaphore>
+export namespace std
+{
+  using std::binary_semaphore;
+  using std::counting_semaphore;
+}
+
+// <set>
+export namespace std
+{
+  using std::set;
+  using std::operator==;
+  using std::operator<=>;
+  using std::erase_if;
+  using std::multiset;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::multiset;
+    using std::pmr::set;
+  }
+}
+
+// <shared_mutex>
+export namespace std
+{
+  using std::shared_lock;
+  using std::shared_mutex;
+  using std::shared_timed_mutex;
+  using std::swap;
+}
+
+// 17.8.1 <source_location>
+export namespace std
+{
+  using std::source_location;
+}
+
+// <span>
+export namespace std
+{
+  using std::dynamic_extent;
+  using std::span;
+  namespace ranges
+  {
+    using std::ranges::enable_borrowed_range;
+    using std::ranges::enable_view;
+  }
+  using std::as_bytes;
+  using std::as_writable_bytes;
+}
+
+// <sstream>
+export namespace std
+{
+  using std::basic_istringstream;
+  using std::basic_ostringstream;
+  using std::basic_stringbuf;
+  using std::basic_stringstream;
+  using std::istringstream;
+  using std::ostringstream;
+  using std::stringbuf;
+  using std::stringstream;
+  using std::swap;
+  using std::wistringstream;
+  using std::wostringstream;
+  using std::wstringbuf;
+  using std::wstringstream;
+}
+
+// <stack>
+export namespace std
+{
+  using std::stack;
+  using std::operator==;
+  using std::operator!=;
+  using std::operator<;
+  using std::operator>;
+  using std::operator<=;
+  using std::operator>=;
+  using std::operator<=>;
+  using std::swap;
+  using std::uses_allocator;
+}
+
+// 19.6 <stacktrace>
+export namespace std
+{
+  using std::stacktrace_entry;
+  using std::basic_stacktrace;
+  using std::stacktrace;
+  using std::swap;
+  using std::to_string;
+  using std::operator<<;
+  using std::formatter;
+  namespace pmr
+  {
+    using std::pmr::stacktrace;
+  }
+  using std::hash;
+}
+
+// 19.2 <stdexcept>
+export namespace std
+{
+  using std::domain_error;
+  using std::invalid_argument;
+  using std::length_error;
+  using std::logic_error;
+  using std::out_of_range;
+  using std::overflow_error;
+  using std::range_error;
+  using std::runtime_error;
+  using std::underflow_error;
+}
+
+// 17.4.2 <stdfloat>
+export namespace std
+{
+#ifdef __STDCPP_FLOAT16_T__
+  using std::float16_t;
+#endif
+#ifdef __STDCPP_FLOAT32_T__
+  using std::float32_t;
+#endif
+#ifdef __STDCPP_FLOAT64_T__
+  using std::float64_t;
+#endif
+#ifdef __STDCPP_FLOAT128_T__
+  using std::float128_t;
+#endif
+#ifdef __STDCPP_BFLOAT16_T__
+  using std::bfloat16_t;
+#endif
+}
+
+// FIXME <stop_token>
+
+// <streambuf>
+export namespace std
+{
+  using std::basic_streambuf;
+  using std::streambuf;
+  using std::wstreambuf;
+}
+
+// <string>
+export namespace std
+{
+  using std::basic_string;
+  using std::char_traits;
+  using std::operator+;
+  using std::operator==;
+  using std::operator<=>;
+  using std::swap;
+  using std::operator>>;
+  using std::operator<<;
+  using std::erase;
+  using std::erase_if;
+  using std::getline;
+  using std::stod;
+  using std::stof;
+  using std::stoi;
+  using std::stol;
+  using std::stold;
+  using std::stoll;
+  using std::stoul;
+  using std::stoull;
+  using std::string;
+  using std::to_string;
+  using std::to_wstring;
+  using std::u16string;
+  using std::u32string;
+  using std::u8string;
+  using std::wstring;
+  namespace pmr
+  {
+    using std::pmr::basic_string;
+    using std::pmr::string;
+    using std::pmr::u16string;
+    using std::pmr::u32string;
+    using std::pmr::u8string;
+    using std::pmr::wstring;
+  }
+  using std::hash;
+  using std::operator""s;
+}
+
+// <string_view>
+export namespace std
+{
+  using std::basic_string_view;
+  namespace ranges
+  {
+    using std::ranges::enable_borrowed_range;
+    using std::ranges::enable_view;
+  }
+  using std::operator==;
+  using std::operator<=>;
+  using std::operator<<;
+  using std::hash;
+  using std::string_view;
+  using std::u16string_view;
+  using std::u32string_view;
+  using std::u8string_view;
+  using std::wstring_view;
+  using std::operator""sv;
+}
+
+// <strstream>: deprecated C++98, removed C++26
+export namespace std
+{
+  using std::istrstream;
+  using std::ostrstream;
+  using std::strstream;
+  using std::strstreambuf;
+}
+
+// <syncstream>
+export namespace std
+{
+  using std::basic_syncbuf;
+  using std::swap;
+  using std::basic_osyncstream;
+  using std::osyncstream;
+  using std::syncbuf;
+  using std::wosyncstream;
+  using std::wsyncbuf;
+}
+
+// 19.5 <system_error>
+export namespace std
+{
+  using std::errc;
+  using std::error_category;
+  using std::error_code;
+  using std::error_condition;
+  using std::generic_category;
+  using std::is_error_code_enum;
+  using std::is_error_condition_enum;
+  using std::make_error_code;
+  using std::system_category;
+  using std::system_error;
+  using std::operator<<;
+  using std::make_error_condition;
+  using std::operator==;
+  using std::operator<=>;
+  using std::hash;
+  using std::is_error_code_enum_v;
+  using std::is_error_condition_enum_v;
+}
+
+// FIXME <text_encoding>
+
+// <thread>
+export namespace std
+{
+  using std::swap;
+  using std::thread;
+  using std::jthread;
+  namespace this_thread
+  {
+    using std::this_thread::get_id;
+    using std::this_thread::sleep_for;
+    using std::this_thread::sleep_until;
+    using std::this_thread::yield;
+  }
+  using std::operator==;
+  using std::operator<=>;
+  using std::operator<<;
+  using std::hash;
+}
+
+// <tuple>
+export namespace std
+{
+  using std::apply;
+  using std::forward_as_tuple;
+  using std::get;
+  using std::ignore;
+  using std::make_from_tuple;
+  using std::make_tuple;
+  using std::tie;
+  using std::tuple;
+  using std::tuple_cat;
+  using std::tuple_element;
+  using std::tuple_element_t;
+  using std::tuple_size;
+  using std::operator==;
+  using std::operator<=>;
+  using std::swap;
+  using std::tuple_size_v;
+  using std::uses_allocator;
+}
+
+// <type_traits>
+export namespace std
+{
+  using std::add_const;
+  using std::add_const_t;
+  using std::add_cv;
+  using std::add_cv_t;
+  using std::add_lvalue_reference;
+  using std::add_lvalue_reference_t;
+  using std::add_pointer;
+  using std::add_pointer_t;
+  using std::add_rvalue_reference;
+  using std::add_rvalue_reference_t;
+  using std::add_volatile;
+  using std::add_volatile_t;
+  using std::aligned_storage;
+  using std::aligned_storage_t;
+  using std::aligned_union;
+  using std::aligned_union_t;
+  using std::alignment_of;
+  using std::alignment_of_v;
+  using std::basic_common_reference;
+  using std::bool_constant;
+  using std::common_reference;
+  using std::common_reference_t;
+  using std::common_type;
+  using std::common_type_t;
+  using std::conditional;
+  using std::conditional_t;
+  using std::conjunction;
+  using std::conjunction_v;
+  using std::decay;
+  using std::decay_t;
+  using std::disjunction;
+  using std::disjunction_v;
+  using std::enable_if;
+  using std::enable_if_t;
+  using std::extent;
+  using std::extent_v;
+  using std::false_type;
+  using std::has_unique_object_representations;
+  using std::has_unique_object_representations_v;
+  using std::has_virtual_destructor;
+  using std::has_virtual_destructor_v;
+  using std::integral_constant;
+  using std::invoke_result;
+  using std::invoke_result_t;
+  using std::is_abstract;
+  using std::is_abstract_v;
+  using std::is_aggregate;
+  using std::is_aggregate_v;
+  using std::is_arithmetic;
+  using std::is_arithmetic_v;
+  using std::is_array;
+  using std::is_array_v;
+  using std::is_assignable;
+  using std::is_assignable_v;
+  using std::is_base_of;
+  using std::is_base_of_v;
+  using std::is_bounded_array;
+  using std::is_bounded_array_v;
+  using std::is_class;
+  using std::is_class_v;
+  using std::is_compound;
+  using std::is_compound_v;
+  using std::is_const;
+  using std::is_const_v;
+  using std::is_constant_evaluated;
+  using std::is_constructible;
+  using std::is_constructible_v;
+  using std::is_convertible;
+  using std::is_convertible_v;
+  using std::is_copy_assignable;
+  using std::is_copy_assignable_v;
+  using std::is_copy_constructible;
+  using std::is_copy_constructible_v;
+  using std::is_default_constructible;
+  using std::is_default_constructible_v;
+  using std::is_destructible;
+  using std::is_destructible_v;
+  using std::is_empty;
+  using std::is_empty_v;
+  using std::is_enum;
+  using std::is_enum_v;
+  using std::is_final;
+  using std::is_final_v;
+  using std::is_floating_point;
+  using std::is_floating_point_v;
+  using std::is_function;
+  using std::is_function_v;
+  using std::is_fundamental;
+  using std::is_fundamental_v;
+  using std::is_integral;
+  using std::is_integral_v;
+  using std::is_invocable;
+  using std::is_invocable_r;
+  using std::is_invocable_r_v;
+  using std::is_invocable_v;
+  using std::is_lvalue_reference;
+  using std::is_lvalue_reference_v;
+  using std::is_member_function_pointer;
+  using std::is_member_function_pointer_v;
+  using std::is_member_object_pointer;
+  using std::is_member_object_pointer_v;
+  using std::is_member_pointer;
+  using std::is_member_pointer_v;
+  using std::is_move_assignable;
+  using std::is_move_assignable_v;
+  using std::is_move_constructible;
+  using std::is_move_constructible_v;
+  using std::is_nothrow_assignable;
+  using std::is_nothrow_assignable_v;
+  using std::is_nothrow_constructible;
+  using std::is_nothrow_constructible_v;
+  using std::is_nothrow_convertible;
+  using std::is_nothrow_convertible_v;
+  using std::is_nothrow_copy_assignable;
+  using std::is_nothrow_copy_assignable_v;
+  using std::is_nothrow_copy_constructible;
+  using std::is_nothrow_copy_constructible_v;
+  using std::is_nothrow_default_constructible;
+  using std::is_nothrow_default_constructible_v;
+  using std::is_nothrow_destructible;
+  using std::is_nothrow_destructible_v;
+  using std::is_nothrow_invocable;
+  using std::is_nothrow_invocable_r;
+  using std::is_nothrow_invocable_r_v;
+  using std::is_nothrow_invocable_v;
+  using std::is_nothrow_move_assignable;
+  using std::is_nothrow_move_assignable_v;
+  using std::is_nothrow_move_constructible;
+  using std::is_nothrow_move_constructible_v;
+  using std::is_nothrow_swappable;
+  using std::is_nothrow_swappable_v;
+  using std::is_nothrow_swappable_with;
+  using std::is_nothrow_swappable_with_v;
+  using std::is_null_pointer;
+  using std::is_null_pointer_v;
+  using std::is_object;
+  using std::is_object_v;
+  using std::is_pod;
+  using std::is_pod_v;
+  using std::is_pointer;
+  using std::is_pointer_v;
+  using std::is_polymorphic;
+  using std::is_polymorphic_v;
+  using std::is_reference;
+  using std::is_reference_v;
+  using std::is_rvalue_reference;
+  using std::is_rvalue_reference_v;
+  using std::is_same;
+  using std::is_same_v;
+  using std::is_scalar;
+  using std::is_scalar_v;
+  using std::is_signed;
+  using std::is_signed_v;
+  using std::is_standard_layout;
+  using std::is_standard_layout_v;
+  using std::is_swappable;
+  using std::is_swappable_v;
+  using std::is_swappable_with;
+  using std::is_swappable_with_v;
+  using std::is_trivial;
+  using std::is_trivial_v;
+  using std::is_trivially_assignable;
+  using std::is_trivially_assignable_v;
+  using std::is_trivially_constructible;
+  using std::is_trivially_constructible_v;
+  using std::is_trivially_copy_assignable;
+  using std::is_trivially_copy_assignable_v;
+  using std::is_trivially_copy_constructible;
+  using std::is_trivially_copy_constructible_v;
+  using std::is_trivially_copyable;
+  using std::is_trivially_copyable_v;
+  using std::is_trivially_default_constructible;
+  using std::is_trivially_default_constructible_v;
+  using std::is_trivially_destructible;
+  using std::is_trivially_destructible_v;
+  using std::is_trivially_move_assignable;
+  using std::is_trivially_move_assignable_v;
+  using std::is_trivially_move_constructible;
+  using std::is_trivially_move_constructible_v;
+  using std::is_unbounded_array;
+  using std::is_unbounded_array_v;
+  using std::is_union;
+  using std::is_union_v;
+  using std::is_unsigned;
+  using std::is_unsigned_v;
+  using std::is_void;
+  using std::is_void_v;
+  using std::is_volatile;
+  using std::is_volatile_v;
+  using std::make_signed;
+  using std::make_signed_t;
+  using std::make_unsigned;
+  using std::make_unsigned_t;
+  using std::negation;
+  using std::negation_v;
+  using std::rank;
+  using std::rank_v;
+  using std::remove_all_extents;
+  using std::remove_all_extents_t;
+  using std::remove_const;
+  using std::remove_const_t;
+  using std::remove_cv;
+  using std::remove_cv_t;
+  using std::remove_cvref;
+  using std::remove_cvref_t;
+  using std::remove_extent;
+  using std::remove_extent_t;
+  using std::remove_pointer;
+  using std::remove_pointer_t;
+  using std::remove_reference;
+  using std::remove_reference_t;
+  using std::remove_volatile;
+  using std::remove_volatile_t;
+  using std::true_type;
+  using std::type_identity;
+  using std::type_identity_t;
+  using std::underlying_type;
+  using std::underlying_type_t;
+  using std::unwrap_ref_decay;
+  using std::unwrap_ref_decay_t;
+  using std::unwrap_reference;
+  using std::unwrap_reference_t;
+  using std::void_t;
+}
+
+// <typeindex>
+export namespace std
+{
+  using std::hash;
+  using std::type_index;
+}
+
+// 17.7.2 <typeinfo> [typeinfo.syn]
+export namespace std
+{
+  using std::bad_cast;
+  using std::bad_typeid;
+  using std::type_info;
+}
+
+// <unordered_map>
+export namespace std
+{
+  using std::unordered_map;
+  using std::unordered_multimap;
+  using std::operator==;
+  using std::erase_if;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::unordered_map;
+    using std::pmr::unordered_multimap;
+  }
+}
+
+// <unordered_set>
+export namespace std
+{
+  using std::unordered_multiset;
+  using std::unordered_set;
+  using std::operator==;
+  using std::erase_if;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::unordered_multiset;
+    using std::pmr::unordered_set;
+  }
+}
+
+// <utility>
+export namespace std
+{
+  using std::as_const;
+  using std::cmp_equal;
+  using std::cmp_greater;
+  using std::cmp_greater_equal;
+  using std::cmp_less;
+  using std::cmp_less_equal;
+  using std::cmp_not_equal;
+  using std::declval;
+  using std::exchange;
+  using std::forward;
+  using std::in_range;
+  using std::index_sequence;
+  using std::index_sequence_for;
+  using std::integer_sequence;
+  using std::make_index_sequence;
+  using std::make_integer_sequence;
+  using std::move;
+  using std::move_if_noexcept;
+  using std::pair;
+  using std::swap;
+  using std::operator==;
+  using std::operator<=>;
+  using std::get;
+  using std::in_place;
+  using std::in_place_index;
+  using std::in_place_index_t;
+  using std::in_place_t;
+  using std::in_place_type;
+  using std::in_place_type_t;
+  using std::make_pair;
+  using std::piecewise_construct;
+  using std::piecewise_construct_t;
+  using std::tuple_element;
+  using std::tuple_size;
+  namespace rel_ops
+  {
+    using std::rel_ops::operator!=;
+    using std::rel_ops::operator>;
+    using std::rel_ops::operator<=;
+    using std::rel_ops::operator>=;
+  }
+}
+
+// <valarray>
+export namespace std
+{
+  using std::gslice;
+  using std::gslice_array;
+  using std::indirect_array;
+  using std::mask_array;
+  using std::slice;
+  using std::slice_array;
+  using std::swap;
+  using std::valarray;
+  using std::operator*;
+  using std::operator/;
+  using std::operator%;
+  using std::operator+;
+  using std::operator-;
+  using std::operator^;
+  using std::operator&;
+  using std::operator|;
+  using std::operator<<;
+  using std::operator>>;
+  using std::operator&&;
+  using std::operator||;
+  using std::operator==;
+  using std::operator!=;
+  using std::operator<;
+  using std::operator>;
+  using std::operator<=;
+  using std::operator>=;
+  using std::abs;
+  using std::acos;
+  using std::asin;
+  using std::atan;
+  using std::atan2;
+  using std::begin;
+  using std::cos;
+  using std::cosh;
+  using std::end;
+  using std::exp;
+  using std::log;
+  using std::log10;
+  using std::pow;
+  using std::sin;
+  using std::sinh;
+  using std::sqrt;
+  using std::tan;
+  using std::tanh;
+}
+
+// <variant>
+export namespace std
+{
+  using std::get;
+  using std::get_if;
+  using std::holds_alternative;
+  using std::variant;
+  using std::variant_alternative;
+  using std::variant_alternative_t;
+  using std::variant_npos;
+  using std::variant_size;
+  using std::variant_size_v;
+  using std::operator==;
+  using std::operator!=;
+  using std::operator<;
+  using std::operator>;
+  using std::operator<=;
+  using std::operator>=;
+  using std::operator<=>;
+  using std::bad_variant_access;
+  using std::hash;
+  using std::monostate;
+  using std::swap;
+  using std::visit;
+}
+
+// <vector>
+export namespace std
+{
+  using std::vector;
+  using std::operator==;
+  using std::operator<=>;
+  using std::erase;
+  using std::erase_if;
+  using std::swap;
+  namespace pmr
+  {
+    using std::pmr::vector;
+  }
+  using std::hash;
+}
diff --git a/libstdc++-v3/src/c++23/modules/std.compat.cc b/libstdc++-v3/src/c++23/modules/std.compat.cc
new file mode 100644
index 00000000000..7d90f20378a
--- /dev/null
+++ b/libstdc++-v3/src/c++23/modules/std.compat.cc
@@ -0,0 +1,640 @@ 
+// -*- C++ -*- [std.modules] module std.compat
+
+// Copyright The GNU Toolchain Authors.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+export module std.compat;
+export import std;
+
+#define STD_COMPAT
+
+// **** The below is copied verbatim from std.cc, starting with "C standard
+// **** library headers" and ending with "End of C library".  Make any edits
+// **** there and update the copy.
+
+// C standard library headers [tab:headers.cpp.c]
+
+#ifndef STD_COMPAT
+#define C_LIB_NAMESPACE namespace std
+#endif
+
+// 19.3 <cassert>
+// No exports
+
+// 23.5.1 <cctype>
+export C_LIB_NAMESPACE
+{
+  using std::isalnum;
+  using std::isalpha;
+  using std::isblank;
+  using std::iscntrl;
+  using std::isdigit;
+  using std::isgraph;
+  using std::islower;
+  using std::isprint;
+  using std::ispunct;
+  using std::isspace;
+  using std::isupper;
+  using std::isxdigit;
+  using std::tolower;
+  using std::toupper;
+}
+
+// 19.4 <cerrno>
+// No exports
+
+// 28.3 <cfenv>
+export C_LIB_NAMESPACE
+{
+  using std::feclearexcept;
+  using std::fegetenv;
+  using std::fegetexceptflag;
+  using std::fegetround;
+  using std::feholdexcept;
+  using std::fenv_t;
+  using std::feraiseexcept;
+  using std::fesetenv;
+  using std::fesetexceptflag;
+  using std::fesetround;
+  using std::fetestexcept;
+  using std::feupdateenv;
+  using std::fexcept_t;
+}
+
+// 17.3.7 <cfloat> [cfloat.syn]
+// No exports, only provides macros
+
+// 31.13.2 <cinttypes>
+export C_LIB_NAMESPACE
+{
+  using std::imaxabs;
+  using std::imaxdiv;
+  using std::imaxdiv_t;
+  using std::strtoimax;
+  using std::strtoumax;
+  using std::wcstoimax;
+  using std::wcstoumax;
+}
+
+// 17.3.6 <climits> [climits.syn]
+// No exports, only provides macros
+
+// 30.5 <clocale>
+export C_LIB_NAMESPACE
+{
+  using std::lconv;
+  using std::localeconv;
+  using std::setlocale;
+  // LC_* macros not exported
+}
+
+// 28.7.1 <cmath>
+// FIXME missing special functions
+export C_LIB_NAMESPACE
+{
+  using std::abs;
+  using std::acos;
+  using std::acosf;
+  using std::acosh;
+  using std::acoshf;
+  using std::acoshl;
+  using std::acosl;
+  using std::asin;
+  using std::asinf;
+  using std::asinh;
+  using std::asinhf;
+  using std::asinhl;
+  using std::asinl;
+  using std::atan;
+  using std::atan2;
+  using std::atan2f;
+  using std::atan2l;
+  using std::atanf;
+  using std::atanh;
+  using std::atanhf;
+  using std::atanhl;
+  using std::atanl;
+  using std::cbrt;
+  using std::cbrtf;
+  using std::cbrtl;
+  using std::ceil;
+  using std::ceilf;
+  using std::ceill;
+  using std::copysign;
+  using std::copysignf;
+  using std::copysignl;
+  using std::cos;
+  using std::cosf;
+  using std::cosh;
+  using std::coshf;
+  using std::coshl;
+  using std::cosl;
+  using std::double_t;
+  using std::erf;
+  using std::erfc;
+  using std::erfcf;
+  using std::erfcl;
+  using std::erff;
+  using std::erfl;
+  using std::exp;
+  using std::exp2;
+  using std::exp2f;
+  using std::exp2l;
+  using std::expf;
+  using std::expl;
+  using std::expm1;
+  using std::expm1f;
+  using std::expm1l;
+  using std::fabs;
+  using std::fabsf;
+  using std::fabsl;
+  using std::fdim;
+  using std::fdimf;
+  using std::fdiml;
+  using std::float_t;
+  using std::floor;
+  using std::floorf;
+  using std::floorl;
+  using std::fma;
+  using std::fmaf;
+  using std::fmal;
+  using std::fmax;
+  using std::fmaxf;
+  using std::fmaxl;
+  using std::fmin;
+  using std::fminf;
+  using std::fminl;
+  using std::fmod;
+  using std::fmodf;
+  using std::fmodl;
+  using std::fpclassify;
+  using std::frexp;
+  using std::frexpf;
+  using std::frexpl;
+  using std::hypot;
+  using std::hypotf;
+  using std::hypotl;
+  using std::ilogb;
+  using std::ilogbf;
+  using std::ilogbl;
+  using std::isfinite;
+  using std::isgreater;
+  using std::isgreaterequal;
+  using std::isinf;
+  using std::isless;
+  using std::islessequal;
+  using std::islessgreater;
+  using std::isnan;
+  using std::isnormal;
+  using std::isunordered;
+  using std::ldexp;
+  using std::ldexpf;
+  using std::ldexpl;
+#ifndef STD_COMPAT
+  using std::lerp;
+#endif
+  using std::lgamma;
+  using std::lgammaf;
+  using std::lgammal;
+  using std::llrint;
+  using std::llrintf;
+  using std::llrintl;
+  using std::llround;
+  using std::llroundf;
+  using std::llroundl;
+  using std::log;
+  using std::log10;
+  using std::log10f;
+  using std::log10l;
+  using std::log1p;
+  using std::log1pf;
+  using std::log1pl;
+  using std::log2;
+  using std::log2f;
+  using std::log2l;
+  using std::logb;
+  using std::logbf;
+  using std::logbl;
+  using std::logf;
+  using std::logl;
+  using std::lrint;
+  using std::lrintf;
+  using std::lrintl;
+  using std::lround;
+  using std::lroundf;
+  using std::lroundl;
+  using std::modf;
+  using std::modff;
+  using std::modfl;
+  using std::nan;
+  using std::nanf;
+  using std::nanl;
+  using std::nearbyint;
+  using std::nearbyintf;
+  using std::nearbyintl;
+  using std::nextafter;
+  using std::nextafterf;
+  using std::nextafterl;
+  using std::nexttoward;
+  using std::nexttowardf;
+  using std::nexttowardl;
+  using std::pow;
+  using std::powf;
+  using std::powl;
+  using std::remainder;
+  using std::remainderf;
+  using std::remainderl;
+  using std::remquo;
+  using std::remquof;
+  using std::remquol;
+  using std::rint;
+  using std::rintf;
+  using std::rintl;
+  using std::round;
+  using std::roundf;
+  using std::roundl;
+  using std::scalbln;
+  using std::scalblnf;
+  using std::scalblnl;
+  using std::scalbn;
+  using std::scalbnf;
+  using std::scalbnl;
+  using std::signbit;
+  using std::sin;
+  using std::sinf;
+  using std::sinh;
+  using std::sinhf;
+  using std::sinhl;
+  using std::sinl;
+  using std::sqrt;
+  using std::sqrtf;
+  using std::sqrtl;
+  using std::tan;
+  using std::tanf;
+  using std::tanh;
+  using std::tanhf;
+  using std::tanhl;
+  using std::tanl;
+  using std::tgamma;
+  using std::tgammaf;
+  using std::tgammal;
+  using std::trunc;
+  using std::truncf;
+  using std::truncl;
+}
+
+// 17.13.3 <csetjmp>
+export C_LIB_NAMESPACE
+{
+  using std::jmp_buf;
+  using std::longjmp;
+  // setjmp macro not exported
+}
+
+// 17.13.4 <csignal>
+export C_LIB_NAMESPACE
+{
+  using std::raise;
+  using std::sig_atomic_t;
+  using std::signal;
+  // SIG_* macros not exported
+}
+
+// 17.13.2 <cstdarg>
+export C_LIB_NAMESPACE
+{
+  using std::va_list;
+  // va_arg and friend macros not exported
+}
+
+// 17.2.1 <cstddef> [cstddef.syn]
+export C_LIB_NAMESPACE
+{
+  using std::max_align_t;
+  using std::nullptr_t;
+  using std::ptrdiff_t;
+  using std::size_t;
+#ifndef STD_COMPAT
+  using std::byte;
+  using std::operator<<=;
+  using std::operator<<;
+  using std::operator>>=;
+  using std::operator>>;
+  using std::operator|=;
+  using std::operator|;
+  using std::operator&=;
+  using std::operator&;
+  using std::operator^=;
+  using std::operator^;
+  using std::operator~;
+  using std::to_integer;
+#endif
+  // NULL and offsetof macros not exported
+}
+
+// 17.4 <cstdint>
+export C_LIB_NAMESPACE
+{
+  using std::int8_t;
+  using std::int16_t;
+  using std::int32_t;
+  using std::int64_t;
+  using std::int_fast16_t;
+  using std::int_fast32_t;
+  using std::int_fast64_t;
+  using std::int_fast8_t;
+  using std::int_least16_t;
+  using std::int_least32_t;
+  using std::int_least64_t;
+  using std::int_least8_t;
+  using std::intmax_t;
+  using std::intptr_t;
+  using std::uint8_t;
+  using std::uint16_t;
+  using std::uint32_t;
+  using std::uint64_t;
+  using std::uint_fast16_t;
+  using std::uint_fast32_t;
+  using std::uint_fast64_t;
+  using std::uint_fast8_t;
+  using std::uint_least16_t;
+  using std::uint_least32_t;
+  using std::uint_least64_t;
+  using std::uint_least8_t;
+  using std::uintmax_t;
+  using std::uintptr_t;
+}
+
+// 31.13.1 <cstdio>
+export C_LIB_NAMESPACE
+{
+  using std::clearerr;
+  using std::fclose;
+  using std::feof;
+  using std::ferror;
+  using std::fflush;
+  using std::fgetc;
+  using std::fgetpos;
+  using std::fgets;
+  using std::FILE;
+  using std::fopen;
+  using std::fpos_t;
+  using std::fprintf;
+  using std::fputc;
+  using std::fputs;
+  using std::fread;
+  using std::freopen;
+  using std::fscanf;
+  using std::fseek;
+  using std::fsetpos;
+  using std::ftell;
+  using std::fwrite;
+  using std::getc;
+  using std::getchar;
+  using std::perror;
+  using std::printf;
+  using std::putc;
+  using std::putchar;
+  using std::puts;
+  using std::remove;
+  using std::rename;
+  using std::rewind;
+  using std::scanf;
+  using std::setbuf;
+  using std::setvbuf;
+  using std::size_t;
+  using std::snprintf;
+  using std::sprintf;
+  using std::sscanf;
+  using std::tmpfile;
+  using std::tmpnam;
+  using std::ungetc;
+  using std::vfprintf;
+  using std::vfscanf;
+  using std::vprintf;
+  using std::vscanf;
+  using std::vsnprintf;
+  using std::vsprintf;
+  using std::vsscanf;
+}
+
+// 17.2.2 <cstdlib> [cstdlib.syn]
+export C_LIB_NAMESPACE
+{
+  using std::_Exit;
+  using std::abort;
+  using std::abs;
+  using std::aligned_alloc;
+  using std::at_quick_exit;
+  using std::atexit;
+  using std::atof;
+  using std::atoi;
+  using std::atol;
+  using std::atoll;
+  using std::bsearch;
+  using std::calloc;
+  using std::div;
+  using std::div_t;
+  using std::exit;
+  using std::free;
+  using std::getenv;
+  using std::labs;
+  using std::ldiv;
+  using std::ldiv_t;
+  using std::llabs;
+  using std::lldiv;
+  using std::lldiv_t;
+  using std::malloc;
+  using std::mblen;
+  using std::mbstowcs;
+  using std::mbtowc;
+  using std::qsort;
+  using std::quick_exit;
+  using std::rand;
+  using std::realloc;
+  using std::size_t;
+  using std::srand;
+  using std::strtod;
+  using std::strtof;
+  using std::strtol;
+  using std::strtold;
+  using std::strtoll;
+  using std::strtoul;
+  using std::strtoull;
+  using std::system;
+  using std::wcstombs;
+  using std::wctomb;
+}
+
+// 23.5.3 <cstring>
+export C_LIB_NAMESPACE
+{
+  using std::memchr;
+  using std::memcmp;
+  using std::memcpy;
+  using std::memmove;
+  using std::memset;
+  using std::size_t;
+  using std::strcat;
+  using std::strchr;
+  using std::strcmp;
+  using std::strcoll;
+  using std::strcpy;
+  using std::strcspn;
+  using std::strerror;
+  using std::strlen;
+  using std::strncat;
+  using std::strncmp;
+  using std::strncpy;
+  using std::strpbrk;
+  using std::strrchr;
+  using std::strspn;
+  using std::strstr;
+  using std::strtok;
+  using std::strxfrm;
+}
+
+// 29.15 <ctime>
+export C_LIB_NAMESPACE
+{
+  using std::asctime;
+  using std::clock;
+  using std::clock_t;
+  using std::ctime;
+  using std::difftime;
+  using std::gmtime;
+  using std::localtime;
+  using std::mktime;
+  using std::size_t;
+  using std::strftime;
+  using std::time;
+  using std::time_t;
+  using std::timespec;
+  using std::tm;
+  using std::timespec_get;
+}
+
+// 23.5.5 <cuchar>
+export C_LIB_NAMESPACE
+{
+  using std::mbrtoc8;
+  using std::c8rtomb;
+  using std::mbrtoc16;
+  using std::c16rtomb;
+  using std::mbrtoc32;
+  using std::c32rtomb;
+}
+
+// 23.5.4 <cwchar>
+export C_LIB_NAMESPACE
+{
+  using std::btowc;
+  using std::fgetwc;
+  using std::fgetws;
+  using std::fputwc;
+  using std::fputws;
+  using std::fwide;
+  using std::fwprintf;
+  using std::fwscanf;
+  using std::getwc;
+  using std::getwchar;
+  using std::mbrlen;
+  using std::mbrtowc;
+  using std::mbsinit;
+  using std::mbsrtowcs;
+  using std::mbstate_t;
+  using std::putwc;
+  using std::putwchar;
+  using std::size_t;
+  using std::swprintf;
+  using std::swscanf;
+  using std::tm;
+  using std::ungetwc;
+  using std::vfwprintf;
+  using std::vfwscanf;
+  using std::vswprintf;
+  using std::vswscanf;
+  using std::vwprintf;
+  using std::vwscanf;
+  using std::wcrtomb;
+  using std::wcscat;
+  using std::wcschr;
+  using std::wcscmp;
+  using std::wcscoll;
+  using std::wcscpy;
+  using std::wcscspn;
+  using std::wcsftime;
+  using std::wcslen;
+  using std::wcsncat;
+  using std::wcsncmp;
+  using std::wcsncpy;
+  using std::wcspbrk;
+  using std::wcsrchr;
+  using std::wcsrtombs;
+  using std::wcsspn;
+  using std::wcsstr;
+  using std::wcstod;
+  using std::wcstof;
+  using std::wcstok;
+  using std::wcstol;
+  using std::wcstold;
+  using std::wcstoll;
+  using std::wcstoul;
+  using std::wcstoull;
+  using std::wcsxfrm;
+  using std::wctob;
+  using std::wint_t;
+  using std::wmemchr;
+  using std::wmemcmp;
+  using std::wmemcpy;
+  using std::wmemmove;
+  using std::wmemset;
+  using std::wprintf;
+  using std::wscanf;
+}
+
+// 23.5.2 <cwctype>
+export C_LIB_NAMESPACE
+{
+  using std::iswalnum;
+  using std::iswalpha;
+  using std::iswblank;
+  using std::iswcntrl;
+  using std::iswctype;
+  using std::iswdigit;
+  using std::iswgraph;
+  using std::iswlower;
+  using std::iswprint;
+  using std::iswpunct;
+  using std::iswspace;
+  using std::iswupper;
+  using std::iswxdigit;
+  using std::towctrans;
+  using std::towlower;
+  using std::towupper;
+  using std::wctrans;
+  using std::wctrans_t;
+  using std::wctype;
+  using std::wctype_t;
+  using std::wint_t;
+}
+
+// **** End of C library ****
diff --git a/contrib/relpath.sh b/contrib/relpath.sh
new file mode 100755
index 00000000000..51bde081636
--- /dev/null
+++ b/contrib/relpath.sh
@@ -0,0 +1,70 @@ 
+#!/bin/sh
+
+if [ "$1" == "--help" ]; then
+    echo Usage: relpath.sh FROM TO
+    echo Print the relative path from FROM to TO
+    echo FROM must be a directory, but need not exist
+fi
+
+if [ -f "$1" ]; then
+    echo first argument must be a directory
+    exit 1
+fi
+
+from="${1%%/}"
+to="${2%%/}"
+
+# Canonicalize directories if they contain '..'.
+canonicalize() {
+    path=$1
+    suffix=
+    while ! [ -d "$path" ]; do
+	name=$(basename "$path")
+	# Give up on a .. that doesn't exist.
+	if [ $"name" = ".." ]; then break; fi
+	path=$(dirname "$path")
+	suffix="/$name$suffix"
+    done
+    if [ -d "$path" ]; then
+	echo $(cd "$path"; pwd)$suffix
+    else
+	echo $1
+    fi
+}
+
+case "$to$from" in
+    *..* )
+	from=$(canonicalize "$from")
+	to=$(canonicalize "$to")
+	;;
+esac
+case "$to$from" in
+    *..* )
+	echo unable to canonicalize ..
+	exit 1
+	;;
+esac
+
+back=
+while [ "${to#$from}" = "$to" ]; do
+    #echo $from too long
+    from=$(dirname $from);
+    back=../$back
+
+    if [ "$from" = "/" ]; then
+	echo $to
+	exit 0
+    fi
+done
+
+to=${to#$from}
+to=${to##/}
+back=${back%%/}
+
+if [ -n "$to" ] && [ -n "$back" ]; then
+    echo $back/$to
+elif [ -n "$back$to" ]; then
+    echo $back$to
+else
+    echo .
+fi
diff --git a/libstdc++-v3/src/c++23/Makefile.am b/libstdc++-v3/src/c++23/Makefile.am
index 74996d1e147..f8149e77102 100644
--- a/libstdc++-v3/src/c++23/Makefile.am
+++ b/libstdc++-v3/src/c++23/Makefile.am
@@ -25,6 +25,24 @@  include $(top_srcdir)/fragment.am
 # Convenience library for C++23 runtime.
 noinst_LTLIBRARIES = libc++23convenience.la
 
+# module std support.  Not compiled for now, only installed.
+toolexeclib_DATA = libstdc++.modules.json
+nobase_pkgdata_DATA = modules/std.cc modules/std.compat.cc
+
+# The manifest to be installed uses the relative path between install dirs.
+libstdc++.modules.json: libstdc++.modules.json.in
+	relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \
+		$(toolexeclibdir) $(pkgdatadir)) && \
+	sed "s,@MODPATH@,$$relpath," $< > $@
+
+# The uninstalled manifest uses the absolute path to srcdir.
+stamp-modules: libstdc++.modules.json.in
+	sed 's,@MODPATH@,$(srcdir),' $< \
+	  > ../.libs/libstdc++.modules.json
+	@touch stamp-modules
+
+all-local: stamp-modules
+
 headers =
 
 if ENABLE_EXTERN_TEMPLATE
diff --git a/libstdc++-v3/src/c++23/Makefile.in b/libstdc++-v3/src/c++23/Makefile.in
index ce609688025..f57232b5035 100644
--- a/libstdc++-v3/src/c++23/Makefile.in
+++ b/libstdc++-v3/src/c++23/Makefile.in
@@ -14,6 +14,7 @@ 
 
 @SET_MAKE@
 
+
 VPATH = @srcdir@
 am__is_gnu_make = { \
   if test -z '$(MAKELEVEL)'; then \
@@ -162,6 +163,36 @@  am__can_run_installinfo = \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(pkgdatadir)" \
+	"$(DESTDIR)$(toolexeclibdir)"
+DATA = $(nobase_pkgdata_DATA) $(toolexeclib_DATA)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -424,6 +455,10 @@  AM_CPPFLAGS = $(GLIBCXX_INCLUDES) $(CPPFLAGS)
 
 # Convenience library for C++23 runtime.
 noinst_LTLIBRARIES = libc++23convenience.la
+
+# module std support.  Not compiled for now, only installed.
+toolexeclib_DATA = libstdc++.modules.json
+nobase_pkgdata_DATA = modules/std.cc modules/std.compat.cc
 headers = 
 # XTEMPLATE_FLAGS =
 @ENABLE_EXTERN_TEMPLATE_FALSE@inst_sources = 
@@ -566,6 +601,51 @@  mostlyclean-libtool:
 
 clean-libtool:
 	-rm -rf .libs _libs
+install-nobase_pkgdataDATA: $(nobase_pkgdata_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)" || exit 1; \
+	fi; \
+	$(am__nobase_list) | while read dir files; do \
+	  xfiles=; for file in $$files; do \
+	    if test -f "$$file"; then xfiles="$$xfiles $$file"; \
+	    else xfiles="$$xfiles $(srcdir)/$$file"; fi; done; \
+	  test -z "$$xfiles" || { \
+	    test "x$$dir" = x. || { \
+	      echo " $(MKDIR_P) '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
+	      $(MKDIR_P) "$(DESTDIR)$(pkgdatadir)/$$dir"; }; \
+	    echo " $(INSTALL_DATA) $$xfiles '$(DESTDIR)$(pkgdatadir)/$$dir'"; \
+	    $(INSTALL_DATA) $$xfiles "$(DESTDIR)$(pkgdatadir)/$$dir" || exit $$?; }; \
+	done
+
+uninstall-nobase_pkgdataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(nobase_pkgdata_DATA)'; test -n "$(pkgdatadir)" || list=; \
+	$(am__nobase_strip_setup); files=`$(am__nobase_strip)`; \
+	dir='$(DESTDIR)$(pkgdatadir)'; $(am__uninstall_files_from_dir)
+install-toolexeclibDATA: $(toolexeclib_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(toolexeclibdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(toolexeclibdir)" || exit $$?; \
+	done
+
+uninstall-toolexeclibDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(toolexeclib_DATA)'; test -n "$(toolexeclibdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(toolexeclibdir)'; $(am__uninstall_files_from_dir)
 
 ID: $(am__tagged_files)
 	$(am__define_uniq_tagged_files); mkid -fID $$unique
@@ -620,8 +700,11 @@  distclean-tags:
 	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
 check-am: all-am
 check: check-am
-all-am: Makefile $(LTLIBRARIES)
+all-am: Makefile $(LTLIBRARIES) $(DATA) all-local
 installdirs:
+	for dir in "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(toolexeclibdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
 install: install-am
 install-exec: install-exec-am
 install-data: install-data-am
@@ -674,13 +757,13 @@  info: info-am
 
 info-am:
 
-install-data-am:
+install-data-am: install-nobase_pkgdataDATA
 
 install-dvi: install-dvi-am
 
 install-dvi-am:
 
-install-exec-am:
+install-exec-am: install-toolexeclibDATA
 
 install-html: install-html-am
 
@@ -719,27 +802,43 @@  ps: ps-am
 
 ps-am:
 
-uninstall-am:
+uninstall-am: uninstall-nobase_pkgdataDATA uninstall-toolexeclibDATA
 
 .MAKE: install-am install-strip
 
-.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \
-	ctags-am distclean distclean-compile distclean-generic \
-	distclean-libtool distclean-tags dvi dvi-am html html-am info \
-	info-am install install-am install-data install-data-am \
-	install-dvi install-dvi-am install-exec install-exec-am \
-	install-html install-html-am install-info install-info-am \
-	install-man install-pdf install-pdf-am install-ps \
-	install-ps-am install-strip installcheck installcheck-am \
-	installdirs maintainer-clean maintainer-clean-generic \
-	mostlyclean mostlyclean-compile mostlyclean-generic \
-	mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \
-	uninstall-am
+.PHONY: CTAGS GTAGS TAGS all all-am all-local check check-am clean \
+	clean-generic clean-libtool clean-noinstLTLIBRARIES \
+	cscopelist-am ctags ctags-am distclean distclean-compile \
+	distclean-generic distclean-libtool distclean-tags dvi dvi-am \
+	html html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-html install-html-am install-info \
+	install-info-am install-man install-nobase_pkgdataDATA \
+	install-pdf install-pdf-am install-ps install-ps-am \
+	install-strip install-toolexeclibDATA installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am \
+	uninstall-nobase_pkgdataDATA uninstall-toolexeclibDATA
 
 .PRECIOUS: Makefile
 
 
+# The manifest to be installed uses the relative path between install dirs.
+libstdc++.modules.json: libstdc++.modules.json.in
+	relpath=$$($(toplevel_srcdir)/contrib/relpath.sh \
+		$(toolexeclibdir) $(pkgdatadir)) && \
+	sed "s,@MODPATH@,$$relpath," $< > $@
+
+# The uninstalled manifest uses the absolute path to srcdir.
+stamp-modules: libstdc++.modules.json.in
+	sed 's,@MODPATH@,$(srcdir),' $< \
+	  > ../.libs/libstdc++.modules.json
+	@touch stamp-modules
+
+all-local: stamp-modules
+
 vpath % $(top_srcdir)/src/c++23
 
 # Use C++26 so that std::filebuf::native_handle() is available.
diff --git a/libstdc++-v3/src/c++23/libstdc++.modules.json.in b/libstdc++-v3/src/c++23/libstdc++.modules.json.in
new file mode 100644
index 00000000000..50714d9c164
--- /dev/null
+++ b/libstdc++-v3/src/c++23/libstdc++.modules.json.in
@@ -0,0 +1,17 @@ 
+// C++ module metadata, to install alongside libstdc++.so
+{
+  "version": 1,
+  "revision": 1,
+  "modules": [
+    {
+      "logical-name": "std",
+      "source-path": "@MODPATH@/modules/std.cc",
+      "is-std-library": true
+    },
+    {
+      "logical-name": "std.compat",
+      "source-path": "@MODPATH@/modules/std.compat.cc",
+      "is-std-library": true
+    }
+  ]
+}