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


Reply via email to