/usr/include/stdatomic.h is not self-contained (fwd from Cygwin list)
Corinna Vinschen
corinna-cygwin@cygwin.com
Mon Feb 9 14:38:04 GMT 2026
[Forwarding to the newlib mailing list]
----- Forwarded message from kikairoya via Cygwin <cygwin@cygwin.com> -----
> Date: Sun, 08 Feb 2026 02:02:48 +0000
> From: kikairoya via Cygwin <cygwin@cygwin.com>
> Subject: /usr/include/stdatomic.h is not self-contained
> To: cygwin@cygwin.com
>
> Hello,
>
> I noticed that /usr/include/stdatomic.h is not self-contained due to lack of
> including <stdint.h>.
>
>
> $ echo '#include "/usr/include/stdatomic.h"' | gcc -xc - -fsyntax-only
> In file included from <stdin>:1:
> /usr/include/stdatomic.h:207:17: error: unknown type name 'int_least8_t'
> 207 | typedef _Atomic(int_least8_t) atomic_int_least8_t;
> | ^~~~~~~~~~~~
> /usr/include/stdatomic.h:208:17: error: unknown type name 'uint_least8_t'
> 208 | typedef _Atomic(uint_least8_t) atomic_uint_least8_t;
> | ^~~~~~~~~~~~~
> [...]
> --
> Tomohiro Kashiwada (@kikairoya)
Newlib's stdatomic.h header is more or less verbatim from FreeBSD(*)
On FreeBSD, the least and fast types are apparently included when
including sys/_types.h, but on Newlib they are not.
Theoretically it would be nice if we could define the atomic types
in terms of the underscored types, e.g.,
typedef _Atomic(__int_least8_t) atomic_int_least8_t;
or
typedef _Atomic(__INT_LEAST8_TYPE__) atomic_int_least8_t;
instead of
typedef _Atomic(int_least8_t) atomic_int_least8_t;
but that falls flat for the fast types, because the macros
__INT_FASTn_TYPE__ / __UINT_FASTn_TYPE__ are not defined on all
compilers apparently. We're explicitely checking for their
existence in stdint.h.
Therefore we either have to include stdint.h from stdatomic.h, as
Tomohiro suggested, or we have to rearrange the headers slightly
and move the FAST definitions into machine/_default_types.h.
The latter might be the better way. We define the underscored
__int_fastN_t and __uint_fastN_t types in machine/_default_types.h
and then define the non-underscored int_fastN_t / uint_fastN_t
type in stdint.h in terms of the underscored types.
Any input from other newlib users on that?
Thanks,
Corinna
(*) But needs an update because it doesn't handle atomic_char8_t at
all and disabled the atomic definitions for atomic_char16_t and
atomic_char32_t, all of which are defined on Cygwin.
More information about the Newlib
mailing list