From 9eaf064cc3eb5a0b1e3964a7577d810ae830410b Mon Sep 17 00:00:00 2001 From: Jens Maurer Date: Mon, 26 Jun 2023 22:36:37 +0200 Subject: [PATCH] P2338R4 Freestanding Library: Character primitives and the C library Editorial notes: - sort table [tab:headers.cpp.fs] by section number --- source/diagnostics.tex | 150 ++++++++++++++++++++--------------------- source/lib-intro.tex | 35 ++++++++-- source/numerics.tex | 8 +-- source/strings.tex | 128 +++++++++++++++++------------------ source/support.tex | 51 ++++++++------ source/utilities.tex | 27 +++++--- 6 files changed, 216 insertions(+), 183 deletions(-) diff --git a/source/diagnostics.tex b/source/diagnostics.tex index be48fa0244..7a92ab5a90 100644 --- a/source/diagnostics.tex +++ b/source/diagnostics.tex @@ -575,80 +575,80 @@ \begin{codeblock} #define errno @\seebelow@ -#define E2BIG @\seebelow@ -#define EACCES @\seebelow@ -#define EADDRINUSE @\seebelow@ -#define EADDRNOTAVAIL @\seebelow@ -#define EAFNOSUPPORT @\seebelow@ -#define EAGAIN @\seebelow@ -#define EALREADY @\seebelow@ -#define EBADF @\seebelow@ -#define EBADMSG @\seebelow@ -#define EBUSY @\seebelow@ -#define ECANCELED @\seebelow@ -#define ECHILD @\seebelow@ -#define ECONNABORTED @\seebelow@ -#define ECONNREFUSED @\seebelow@ -#define ECONNRESET @\seebelow@ -#define EDEADLK @\seebelow@ -#define EDESTADDRREQ @\seebelow@ -#define EDOM @\seebelow@ -#define EEXIST @\seebelow@ -#define EFAULT @\seebelow@ -#define EFBIG @\seebelow@ -#define EHOSTUNREACH @\seebelow@ -#define EIDRM @\seebelow@ -#define EILSEQ @\seebelow@ -#define EINPROGRESS @\seebelow@ -#define EINTR @\seebelow@ -#define EINVAL @\seebelow@ -#define EIO @\seebelow@ -#define EISCONN @\seebelow@ -#define EISDIR @\seebelow@ -#define ELOOP @\seebelow@ -#define EMFILE @\seebelow@ -#define EMLINK @\seebelow@ -#define EMSGSIZE @\seebelow@ -#define ENAMETOOLONG @\seebelow@ -#define ENETDOWN @\seebelow@ -#define ENETRESET @\seebelow@ -#define ENETUNREACH @\seebelow@ -#define ENFILE @\seebelow@ -#define ENOBUFS @\seebelow@ -#define ENODEV @\seebelow@ -#define ENOENT @\seebelow@ -#define ENOEXEC @\seebelow@ -#define ENOLCK @\seebelow@ -#define ENOLINK @\seebelow@ -#define ENOMEM @\seebelow@ -#define ENOMSG @\seebelow@ -#define ENOPROTOOPT @\seebelow@ -#define ENOSPC @\seebelow@ -#define ENOSYS @\seebelow@ -#define ENOTCONN @\seebelow@ -#define ENOTDIR @\seebelow@ -#define ENOTEMPTY @\seebelow@ -#define ENOTRECOVERABLE @\seebelow@ -#define ENOTSOCK @\seebelow@ -#define ENOTSUP @\seebelow@ -#define ENOTTY @\seebelow@ -#define ENXIO @\seebelow@ -#define EOPNOTSUPP @\seebelow@ -#define EOVERFLOW @\seebelow@ -#define EOWNERDEAD @\seebelow@ -#define EPERM @\seebelow@ -#define EPIPE @\seebelow@ -#define EPROTO @\seebelow@ -#define EPROTONOSUPPORT @\seebelow@ -#define EPROTOTYPE @\seebelow@ -#define ERANGE @\seebelow@ -#define EROFS @\seebelow@ -#define ESPIPE @\seebelow@ -#define ESRCH @\seebelow@ -#define ETIMEDOUT @\seebelow@ -#define ETXTBSY @\seebelow@ -#define EWOULDBLOCK @\seebelow@ -#define EXDEV @\seebelow@ +#define E2BIG @\seebelow@ // freestanding +#define EACCES @\seebelow@ // freestanding +#define EADDRINUSE @\seebelow@ // freestanding +#define EADDRNOTAVAIL @\seebelow@ // freestanding +#define EAFNOSUPPORT @\seebelow@ // freestanding +#define EAGAIN @\seebelow@ // freestanding +#define EALREADY @\seebelow@ // freestanding +#define EBADF @\seebelow@ // freestanding +#define EBADMSG @\seebelow@ // freestanding +#define EBUSY @\seebelow@ // freestanding +#define ECANCELED @\seebelow@ // freestanding +#define ECHILD @\seebelow@ // freestanding +#define ECONNABORTED @\seebelow@ // freestanding +#define ECONNREFUSED @\seebelow@ // freestanding +#define ECONNRESET @\seebelow@ // freestanding +#define EDEADLK @\seebelow@ // freestanding +#define EDESTADDRREQ @\seebelow@ // freestanding +#define EDOM @\seebelow@ // freestanding +#define EEXIST @\seebelow@ // freestanding +#define EFAULT @\seebelow@ // freestanding +#define EFBIG @\seebelow@ // freestanding +#define EHOSTUNREACH @\seebelow@ // freestanding +#define EIDRM @\seebelow@ // freestanding +#define EILSEQ @\seebelow@ // freestanding +#define EINPROGRESS @\seebelow@ // freestanding +#define EINTR @\seebelow@ // freestanding +#define EINVAL @\seebelow@ // freestanding +#define EIO @\seebelow@ // freestanding +#define EISCONN @\seebelow@ // freestanding +#define EISDIR @\seebelow@ // freestanding +#define ELOOP @\seebelow@ // freestanding +#define EMFILE @\seebelow@ // freestanding +#define EMLINK @\seebelow@ // freestanding +#define EMSGSIZE @\seebelow@ // freestanding +#define ENAMETOOLONG @\seebelow@ // freestanding +#define ENETDOWN @\seebelow@ // freestanding +#define ENETRESET @\seebelow@ // freestanding +#define ENETUNREACH @\seebelow@ // freestanding +#define ENFILE @\seebelow@ // freestanding +#define ENOBUFS @\seebelow@ // freestanding +#define ENODEV @\seebelow@ // freestanding +#define ENOENT @\seebelow@ // freestanding +#define ENOEXEC @\seebelow@ // freestanding +#define ENOLCK @\seebelow@ // freestanding +#define ENOLINK @\seebelow@ // freestanding +#define ENOMEM @\seebelow@ // freestanding +#define ENOMSG @\seebelow@ // freestanding +#define ENOPROTOOPT @\seebelow@ // freestanding +#define ENOSPC @\seebelow@ // freestanding +#define ENOSYS @\seebelow@ // freestanding +#define ENOTCONN @\seebelow@ // freestanding +#define ENOTDIR @\seebelow@ // freestanding +#define ENOTEMPTY @\seebelow@ // freestanding +#define ENOTRECOVERABLE @\seebelow@ // freestanding +#define ENOTSOCK @\seebelow@ // freestanding +#define ENOTSUP @\seebelow@ // freestanding +#define ENOTTY @\seebelow@ // freestanding +#define ENXIO @\seebelow@ // freestanding +#define EOPNOTSUPP @\seebelow@ // freestanding +#define EOVERFLOW @\seebelow@ // freestanding +#define EOWNERDEAD @\seebelow@ // freestanding +#define EPERM @\seebelow@ // freestanding +#define EPIPE @\seebelow@ // freestanding +#define EPROTO @\seebelow@ // freestanding +#define EPROTONOSUPPORT @\seebelow@ // freestanding +#define EPROTOTYPE @\seebelow@ // freestanding +#define ERANGE @\seebelow@ // freestanding +#define EROFS @\seebelow@ // freestanding +#define ESPIPE @\seebelow@ // freestanding +#define ESRCH @\seebelow@ // freestanding +#define ETIMEDOUT @\seebelow@ // freestanding +#define ETXTBSY @\seebelow@ // freestanding +#define EWOULDBLOCK @\seebelow@ // freestanding +#define EXDEV @\seebelow@ // freestanding \end{codeblock} \pnum @@ -701,7 +701,7 @@ template struct is_error_condition_enum : public false_type {}; - enum class errc { + enum class errc { // freestanding address_family_not_supported, // \tcode{EAFNOSUPPORT} address_in_use, // \tcode{EADDRINUSE} address_not_available, // \tcode{EADDRNOTAVAIL} diff --git a/source/lib-intro.tex b/source/lib-intro.tex index a40f66a4b3..b774ca2f1a 100644 --- a/source/lib-intro.tex +++ b/source/lib-intro.tex @@ -948,6 +948,20 @@ \end{codeblock} \end{example} +\pnum +Function declarations and function template declarations +followed by a comment that include \textit{freestanding-deleted} are +\defnadjx{freestanding deleted}{functions}{function}. +On freestanding implementations, +it is \impldef{whether a freestanding deleted function is a freestanding item or a deleted function} +whether each function definition introduced by a freestanding deleted function +is a freestanding item or a deleted function\iref{dcl.fct.def.delete}. +\begin{example} +\begin{codeblock} +double abs(double j); // freestanding-deleted +\end{codeblock} +\end{example} + \rSec1[requirements]{Library-wide requirements} \rSec2[requirements.general]{General} @@ -1441,10 +1455,11 @@ \begin{libsumtab}{\Cpp{} headers for freestanding implementations}{headers.cpp.fs} \ref{support.types} & Common definitions & \tcode{} \\ \rowsep +\ref{cstdlib.syn} & C standard library & \tcode{} \\ \rowsep \ref{support.limits} & Implementation properties & - \tcode{}, \tcode{}, \tcode{}, \tcode{} \\ \rowsep + \tcode{}, \tcode{}, \tcode{}, \\ + & & \tcode{} \\ \rowsep \ref{cstdint.syn} & Integer types & \tcode{} \\ \rowsep -\ref{support.start.term} & Start and termination & \tcode{} \\ \rowsep \ref{support.dynamic} & Dynamic memory management & \tcode{} \\ \rowsep \ref{support.rtti} & Type identification & \tcode{} \\ \rowsep \ref{support.srcloc} & Source location & \tcode{} \\ \rowsep @@ -1454,16 +1469,22 @@ \ref{support.coroutine} & Coroutines support & \tcode{} \\ \rowsep \ref{support.runtime} & Other runtime support & \tcode{} \\ \rowsep \ref{concepts} & Concepts library & \tcode{} \\ \rowsep +\ref{errno} & Error numbers & \tcode{} \\ \rowsep +\ref{syserr} & System error support & \tcode{} \\ \rowsep +\ref{memory} & Memory & \tcode{} \\ \rowsep \ref{type.traits} & Type traits & \tcode{} \\ \rowsep -\ref{bit} & Bit manipulation & \tcode{} \\ \rowsep -\ref{atomics} & Atomics & \tcode{} \\ \rowsep +\ref{ratio} & Compile-time rational arithmetic & \tcode{} \\ \rowsep \ref{utility} & Utility components & \tcode{} \\ \rowsep \ref{tuple} & Tuples & \tcode{} \\ \rowsep -\ref{memory} & Memory & \tcode{} \\ \rowsep \ref{function.objects} & Function objects & \tcode{} \\ \rowsep -\ref{ratio} & Compile-time rational arithmetic & \tcode{} \\ \rowsep +\ref{charconv} & Primitive numeric conversions & \tcode{} \\ \rowsep +\ref{bit} & Bit manipulation & \tcode{} \\ \rowsep +\ref{string.classes} & String classes & \tcode{} \\ \rowsep +\ref{c.strings} & Null-terminated sequence utilities & \tcode{}, \tcode{} \\ \rowsep \ref{iterators} & Iterators library & \tcode{} \\ \rowsep -\ref{ranges} & Ranges library & \tcode{} \\ +\ref{ranges} & Ranges library & \tcode{} \\ \rowsep +\ref{c.math} & Mathematical functions for floating-point types & \tcode{} \\ \rowsep +\ref{atomics} & Atomics & \tcode{} \\ \rowsep \end{libsumtab} \pnum diff --git a/source/numerics.tex b/source/numerics.tex index 81efc1e347..680ca3dfe0 100644 --- a/source/numerics.tex +++ b/source/numerics.tex @@ -9072,10 +9072,10 @@ long double cbrtl(long double x); // \ref{c.math.abs}, absolute values - constexpr int abs(int j); - constexpr long int abs(long int j); - constexpr long long int abs(long long int j); - constexpr @\placeholder{floating-point-type}@ abs(@\placeholder{floating-point-type}@ j); + constexpr int abs(int j); // freestanding + constexpr long int abs(long int j); // freestanding + constexpr long long int abs(long long int j); // freestanding + constexpr @\placeholder{floating-point-type}@ abs(@\placeholder{floating-point-type}@ j); // freestanding-deleted constexpr @\placeholder{floating-point-type}@ fabs(@\placeholder{floating-point-type}@ x); constexpr float fabsf(float x); diff --git a/source/strings.tex b/source/strings.tex index 55b41e31ee..31e778e991 100644 --- a/source/strings.tex +++ b/source/strings.tex @@ -1793,12 +1793,12 @@ namespace std { // \ref{char.traits}, character traits - template struct char_traits; - template<> struct char_traits; - template<> struct char_traits; - template<> struct char_traits; - template<> struct char_traits; - template<> struct char_traits; + template struct char_traits; // freestanding + template<> struct char_traits; // freestanding + template<> struct char_traits; // freestanding + template<> struct char_traits; // freestanding + template<> struct char_traits; // freestanding + template<> struct char_traits; // freestanding // \ref{basic.string}, \tcode{basic_string} template, class Allocator = allocator> @@ -5492,38 +5492,38 @@ \indexlibraryglobal{strxfrm}% \begin{codeblock} namespace std { - using size_t = @\textit{see \ref{support.types.layout}}@; - - void* memcpy(void* s1, const void* s2, size_t n); - void* memmove(void* s1, const void* s2, size_t n); - char* strcpy(char* s1, const char* s2); - char* strncpy(char* s1, const char* s2, size_t n); - char* strcat(char* s1, const char* s2); - char* strncat(char* s1, const char* s2, size_t n); - int memcmp(const void* s1, const void* s2, size_t n); - int strcmp(const char* s1, const char* s2); + using size_t = @\textit{see \ref{support.types.layout}}@; // freestanding + + void* memcpy(void* s1, const void* s2, size_t n); // freestanding + void* memmove(void* s1, const void* s2, size_t n); // freestanding + char* strcpy(char* s1, const char* s2); // freestanding + char* strncpy(char* s1, const char* s2, size_t n); // freestanding + char* strcat(char* s1, const char* s2); // freestanding + char* strncat(char* s1, const char* s2, size_t n); // freestanding + int memcmp(const void* s1, const void* s2, size_t n); // freestanding + int strcmp(const char* s1, const char* s2); // freestanding int strcoll(const char* s1, const char* s2); - int strncmp(const char* s1, const char* s2, size_t n); + int strncmp(const char* s1, const char* s2, size_t n); // freestanding size_t strxfrm(char* s1, const char* s2, size_t n); - const void* memchr(const void* s, int c, size_t n); // see \ref{library.c} - void* memchr(void* s, int c, size_t n); // see \ref{library.c} - const char* strchr(const char* s, int c); // see \ref{library.c} - char* strchr(char* s, int c); // see \ref{library.c} - size_t strcspn(const char* s1, const char* s2); - const char* strpbrk(const char* s1, const char* s2); // see \ref{library.c} - char* strpbrk(char* s1, const char* s2); // see \ref{library.c} - const char* strrchr(const char* s, int c); // see \ref{library.c} - char* strrchr(char* s, int c); // see \ref{library.c} - size_t strspn(const char* s1, const char* s2); - const char* strstr(const char* s1, const char* s2); // see \ref{library.c} - char* strstr(char* s1, const char* s2); // see \ref{library.c} - char* strtok(char* s1, const char* s2); - void* memset(void* s, int c, size_t n); + const void* memchr(const void* s, int c, size_t n); // freestanding; see \ref{library.c} + void* memchr(void* s, int c, size_t n); // freestanding; see \ref{library.c} + const char* strchr(const char* s, int c); // freestanding; see \ref{library.c} + char* strchr(char* s, int c); // freestanding; see \ref{library.c} + size_t strcspn(const char* s1, const char* s2); // freestanding + const char* strpbrk(const char* s1, const char* s2); // freestanding; see \ref{library.c} + char* strpbrk(char* s1, const char* s2); // freestanding; see \ref{library.c} + const char* strrchr(const char* s, int c); // freestanding; see \ref{library.c} + char* strrchr(char* s, int c); // freestanding; see \ref{library.c} + size_t strspn(const char* s1, const char* s2); // freestanding + const char* strstr(const char* s1, const char* s2); // freestanding; see \ref{library.c} + char* strstr(char* s1, const char* s2); // freestanding; see \ref{library.c} + char* strtok(char* s1, const char* s2); // freestanding + void* memset(void* s, int c, size_t n); // freestanding char* strerror(int errnum); - size_t strlen(const char* s); + size_t strlen(const char* s); // freestanding } -#define NULL @\textit{see \ref{support.types.nullptr}}@ +#define NULL @\textit{see \ref{support.types.nullptr}}@ // freestanding \end{codeblock} \pnum @@ -5624,9 +5624,9 @@ \indexlibraryglobal{wscanf}% \begin{codeblock} namespace std { - using size_t = @\textit{see \ref{support.types.layout}}@; - using mbstate_t = @\seebelow@; - using wint_t = @\seebelow@; + using size_t = @\textit{see \ref{support.types.layout}}@; // freestanding + using mbstate_t = @\seebelow@; // freestanding + using wint_t = @\seebelow@; // freestanding struct tm; @@ -5659,32 +5659,32 @@ long long int wcstoll(const wchar_t* nptr, wchar_t** endptr, int base); unsigned long int wcstoul(const wchar_t* nptr, wchar_t** endptr, int base); unsigned long long int wcstoull(const wchar_t* nptr, wchar_t** endptr, int base); - wchar_t* wcscpy(wchar_t* s1, const wchar_t* s2); - wchar_t* wcsncpy(wchar_t* s1, const wchar_t* s2, size_t n); - wchar_t* wmemcpy(wchar_t* s1, const wchar_t* s2, size_t n); - wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t n); - wchar_t* wcscat(wchar_t* s1, const wchar_t* s2); - wchar_t* wcsncat(wchar_t* s1, const wchar_t* s2, size_t n); - int wcscmp(const wchar_t* s1, const wchar_t* s2); + wchar_t* wcscpy(wchar_t* s1, const wchar_t* s2); // freestanding + wchar_t* wcsncpy(wchar_t* s1, const wchar_t* s2, size_t n); // freestanding + wchar_t* wmemcpy(wchar_t* s1, const wchar_t* s2, size_t n); // freestanding + wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t n); // freestanding + wchar_t* wcscat(wchar_t* s1, const wchar_t* s2); // freestanding + wchar_t* wcsncat(wchar_t* s1, const wchar_t* s2, size_t n); // freestanding + int wcscmp(const wchar_t* s1, const wchar_t* s2); // freestanding int wcscoll(const wchar_t* s1, const wchar_t* s2); - int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n); + int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n); // freestanding size_t wcsxfrm(wchar_t* s1, const wchar_t* s2, size_t n); - int wmemcmp(const wchar_t* s1, const wchar_t* s2, size_t n); - const wchar_t* wcschr(const wchar_t* s, wchar_t c); // see \ref{library.c} - wchar_t* wcschr(wchar_t* s, wchar_t c); // see \ref{library.c} - size_t wcscspn(const wchar_t* s1, const wchar_t* s2); - const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2); // see \ref{library.c} - wchar_t* wcspbrk(wchar_t* s1, const wchar_t* s2); // see \ref{library.c} - const wchar_t* wcsrchr(const wchar_t* s, wchar_t c); // see \ref{library.c} - wchar_t* wcsrchr(wchar_t* s, wchar_t c); // see \ref{library.c} - size_t wcsspn(const wchar_t* s1, const wchar_t* s2); - const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2); // see \ref{library.c} - wchar_t* wcsstr(wchar_t* s1, const wchar_t* s2); // see \ref{library.c} - wchar_t* wcstok(wchar_t* s1, const wchar_t* s2, wchar_t** ptr); - const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n); // see \ref{library.c} - wchar_t* wmemchr(wchar_t* s, wchar_t c, size_t n); // see \ref{library.c} - size_t wcslen(const wchar_t* s); - wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n); + int wmemcmp(const wchar_t* s1, const wchar_t* s2, size_t n); // freestanding + const wchar_t* wcschr(const wchar_t* s, wchar_t c); // freestanding; see \ref{library.c} + wchar_t* wcschr(wchar_t* s, wchar_t c); // freestanding; see \ref{library.c} + size_t wcscspn(const wchar_t* s1, const wchar_t* s2); // freestanding + const wchar_t* wcspbrk(const wchar_t* s1, const wchar_t* s2); // freestanding; see \ref{library.c} + wchar_t* wcspbrk(wchar_t* s1, const wchar_t* s2); // freestanding; see \ref{library.c} + const wchar_t* wcsrchr(const wchar_t* s, wchar_t c); // freestanding; see \ref{library.c} + wchar_t* wcsrchr(wchar_t* s, wchar_t c); // freestanding; see \ref{library.c} + size_t wcsspn(const wchar_t* s1, const wchar_t* s2); // freestanding + const wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2); // freestanding; see \ref{library.c} + wchar_t* wcsstr(wchar_t* s1, const wchar_t* s2); // freestanding; see \ref{library.c} + wchar_t* wcstok(wchar_t* s1, const wchar_t* s2, wchar_t** ptr); // freestanding + const wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n); // freestanding; see \ref{library.c} + wchar_t* wmemchr(wchar_t* s, wchar_t c, size_t n); // freestanding; see \ref{library.c} + size_t wcslen(const wchar_t* s); // freestanding + wchar_t* wmemset(wchar_t* s, wchar_t c, size_t n); // freestanding size_t wcsftime(wchar_t* s, size_t maxsize, const wchar_t* format, const tm* timeptr); wint_t btowc(int c); int wctob(wint_t c); @@ -5698,10 +5698,10 @@ size_t wcsrtombs(char* dst, const wchar_t** src, size_t len, mbstate_t* ps); } -#define NULL @\textit{see \ref{support.types.nullptr}}@ -#define WCHAR_MAX @\seebelow@ -#define WCHAR_MIN @\seebelow@ -#define WEOF @\seebelow@ +#define NULL @\textit{see \ref{support.types.nullptr}}@ // freestanding +#define WCHAR_MAX @\seebelow@ // freestanding +#define WCHAR_MIN @\seebelow@ // freestanding +#define WEOF @\seebelow@ // freestanding \end{codeblock} \pnum diff --git a/source/support.tex b/source/support.tex index 24d186bdd8..7e17cf0c49 100644 --- a/source/support.tex +++ b/source/support.tex @@ -150,14 +150,14 @@ \begin{codeblock} namespace std { using size_t = @\seebelow@; // freestanding - using div_t = @\seebelow@; - using ldiv_t = @\seebelow@; - using lldiv_t = @\seebelow@; + using div_t = @\seebelow@; // freestanding + using ldiv_t = @\seebelow@; // freestanding + using lldiv_t = @\seebelow@; // freestanding } #define NULL @\seebelow@ // freestanding -#define EXIT_FAILURE @\seebelow@ -#define EXIT_SUCCESS @\seebelow@ +#define EXIT_FAILURE @\seebelow@ // freestanding +#define EXIT_SUCCESS @\seebelow@ // freestanding #define RAND_MAX @\seebelow@ #define MB_CUR_MAX @\seebelow@ @@ -208,31 +208,31 @@ size_t wcstombs(char* s, const wchar_t* pwcs, size_t n); // \ref{alg.c.library}, C standard library algorithms - void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, + void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, // freestanding @\placeholder{c-compare-pred}@*@\itcorr[-1]@ compar); - void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, + void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, // freestanding @\placeholder{compare-pred}@*@\itcorr[-1]@ compar); - void qsort(void* base, size_t nmemb, size_t size, @\placeholder{c-compare-pred}@*@\itcorr[-1]@ compar); - void qsort(void* base, size_t nmemb, size_t size, @\placeholder{compare-pred}@*@\itcorr[-1]@ compar); + void qsort(void* base, size_t nmemb, size_t size, @\placeholder{c-compare-pred}@*@\itcorr[-1]@ compar); // freestanding + void qsort(void* base, size_t nmemb, size_t size, @\placeholder{compare-pred}@*@\itcorr[-1]@ compar); // freestanding // \ref{c.math.rand}, low-quality random number generation int rand(); void srand(unsigned int seed); // \ref{c.math.abs}, absolute values - constexpr int abs(int j); - constexpr long int abs(long int j); - constexpr long long int abs(long long int j); - constexpr @\placeholder{floating-point-type}@ abs(@\placeholder{floating-point-type}@ j); - - constexpr long int labs(long int j); - constexpr long long int llabs(long long int j); - - constexpr div_t div(int numer, int denom); - constexpr ldiv_t div(long int numer, long int denom); // see \ref{library.c} - constexpr lldiv_t div(long long int numer, long long int denom); // see \ref{library.c} - constexpr ldiv_t ldiv(long int numer, long int denom); - constexpr lldiv_t lldiv(long long int numer, long long int denom); + constexpr int abs(int j); // freestanding + constexpr long int abs(long int j); // freestanding + constexpr long long int abs(long long int j); // freestanding + constexpr @\placeholder{floating-point-type}@ abs(@\placeholder{floating-point-type}@ j); // freestanding-deleted + + constexpr long int labs(long int j); // freestanding + constexpr long long int llabs(long long int j); // freestanding + + constexpr div_t div(int numer, int denom); // freestanding + constexpr ldiv_t div(long int numer, long int denom); // freestanding; see \ref{library.c} + constexpr lldiv_t div(long long int numer, long long int denom); // freestanding; see \ref{library.c} + constexpr ldiv_t ldiv(long int numer, long int denom); // freestanding + constexpr lldiv_t lldiv(long long int numer, long long int denom); // freestanding } \end{codeblock} @@ -630,6 +630,13 @@ #define @\defnlibxname{cpp_lib_format_ranges}@ 202207L // also in \libheader{format} #define @\defnlibxname{cpp_lib_formatters}@ 202302L // also in \libheader{stacktrace}, \libheader{thread} #define @\defnlibxname{cpp_lib_forward_like}@ 202207L // freestanding, also in \libheader{utility} +#define @\defnlibxname{cpp_lib_freestanding_char_traits}@ 202306L // freestanding, also in \libheader{string} +#define @\defnlibxname{cpp_lib_freestanding_charconv}@ 202306L // freestanding, also in \libheader{charconv} +#define @\defnlibxname{cpp_lib_freestanding_cstdlib}@ 202306L // freestanding, also in \libheader{stdlib}, \libheader{cmath} +#define @\defnlibxname{cpp_lib_freestanding_cstring}@ 202306L // freestanding, also in \libheader{cstring} +#define @\defnlibxname{cpp_lib_freestanding_cwchar}@ 202306L // freestanding, also in \libheader{cwchar} +#define @\defnlibxname{cpp_lib_freestanding_errc}@ 202306L + // freestanding, also in \libheader{cerrno}, \libheader{system_error} #define @\defnlibxname{cpp_lib_freestanding_feature_test_macros}@ 202306L // freestanding #define @\defnlibxname{cpp_lib_freestanding_functional}@ 202306L // freestanding, also in \libheader{functional} #define @\defnlibxname{cpp_lib_freestanding_iterator}@ 202306L // freestanding, also in \libheader{iterator} diff --git a/source/utilities.tex b/source/utilities.tex index 942af1431c..ab5db626f6 100644 --- a/source/utilities.tex +++ b/source/utilities.tex @@ -14197,37 +14197,42 @@ \indexlibrarymember{ec}{to_chars_result} @ // \ref{charconv.to.chars}, primitive numerical output conversion - struct to_chars_result { + struct to_chars_result { // freestanding char* ptr; errc ec; friend bool operator==(const to_chars_result&, const to_chars_result&) = default; constexpr explicit operator bool() const noexcept { return ec == errc{}; } }; - constexpr to_chars_result to_chars(char* first, char* last, @\placeholder{integer-type}@ value, int base = 10); - to_chars_result to_chars(char* first, char* last, bool value, int base = 10) = delete; - - to_chars_result to_chars(char* first, char* last, @\placeholder{floating-point-type}@ value); - to_chars_result to_chars(char* first, char* last, @\placeholder{floating-point-type}@ value, chars_format fmt); - to_chars_result to_chars(char* first, char* last, @\placeholder{floating-point-type}@ value, - chars_format fmt, int precision); + constexpr to_chars_result to_chars(char* first, char* last, // freestanding + @\placeholder{integer-type}@ value, int base = 10); + to_chars_result to_chars(char* first, char* last, // freestanding + bool value, int base = 10) = delete; + + to_chars_result to_chars(char* first, char* last, // freestanding-deleted + @\placeholder{floating-point-type}@ value); + to_chars_result to_chars(char* first, char* last, // freestanding-deleted + @\placeholder{floating-point-type}@ value, chars_format fmt); + to_chars_result to_chars(char* first, char* last, // freestanding-deleted + @\placeholder{floating-point-type}@ value, chars_format fmt, int precision); @% \indexlibraryglobal{from_chars_result}% \indexlibrarymember{ptr}{from_chars_result}% \indexlibrarymember{ec}{from_chars_result} @ // \ref{charconv.from.chars}, primitive numerical input conversion - struct from_chars_result { + struct from_chars_result { // freestanding const char* ptr; errc ec; friend bool operator==(const from_chars_result&, const from_chars_result&) = default; constexpr explicit operator bool() const noexcept { return ec == errc{}; } }; - constexpr from_chars_result from_chars(const char* first, const char* last, + constexpr from_chars_result from_chars(const char* first, const char* last, // freestanding @\placeholder{integer-type}@& value, int base = 10); - from_chars_result from_chars(const char* first, const char* last, @\placeholder{floating-point-type}@& value, + from_chars_result from_chars(const char* first, const char* last, // freestanding-deleted + @\placeholder{floating-point-type}@& value, chars_format fmt = chars_format::general); } \end{codeblock}