Hi Bjorn, Thanks for the patch - please CC me on Darwin/macOS-related patches.
> On 14 Aug 2026, at 04:24, Bjorn Pagen <[email protected]> wrote: > > GCC's <stddef.h> supports selective type requests such as > __need_size_t. System headers, including the macOS SDK, use the same > protocol to request rsize_t with __need_rsize_t. Clang handles this > request, but GCC's <stddef.h> returned without defining rsize_t. > > This patch handles only an explicit __need_rsize_t request. It defines > rsize_t as __SIZE_TYPE__, uses _RSIZE_T to match Clang and the SDK's > non-modular path, and undefines __need_rsize_t after processing it. As > with other partial requests, it does not mark <stddef.h> as fully > included. > > A normal inclusion still does not define rsize_t, including when > __STDC_WANT_LIB_EXT1__ is set. Defining it in that case would expose an > Annex K name on targets whose C libraries do not implement Annex K. > RSIZE_MAX and the bounds-checking functions remain the C library's > responsibility. > > PR target/126782 was first observed on Darwin with -fmodules. GCC 16 > reported __has_feature(modules), which made the SDK request > __need_rsize_t. GCC trunk no longer reports that feature, so the > original testcase now compiles without this patch. The patch adds > support for the underlying header protocol without restoring the old > trigger. > > Bootstrapped all default languages on aarch64-unknown-linux-gnu. > Stages 2 and 3 compared equal. A full make -k check completed with: > PASS=997628 FAIL=57 XFAIL=5623 XPASS=0 UNSUPPORTED=11149 UNRESOLVED=7 > ERROR=0. All five new tests passed. No local pre-patch full-suite > baseline was run. The 57 failures do not mention stddef.h or rsize_t. > > Is this OK for trunk? This has already been fixed on trunk - by https://gcc.gnu.org/cgit/gcc/commit/?id=08ede4fbbe6d38. Backports are to follow - at present, it has been backported to the aarch64 darwin developmnet branch only. thanks Iain > > gcc/ChangeLog: > > PR target/126782 > * ginclude/stddef.h (__need_rsize_t): New selective-inclusion > request. Define rsize_t as __SIZE_TYPE__. > > gcc/testsuite/ChangeLog: > > PR target/126782 > * gcc.dg/stddef-need-rsize-1.c: New test. > * gcc.dg/stddef-need-rsize-2.c: New test. > * gcc.dg/stddef-need-rsize-3.c: New test. > * gcc.dg/stddef-need-rsize-4.c: New test. > * g++.dg/stddef-need-rsize-1.C: New test. > > Signed-off-by: Bjorn Pagen <[email protected]> > --- > gcc/ginclude/stddef.h | 19 ++++++++++-- > gcc/testsuite/g++.dg/stddef-need-rsize-1.C | 15 ++++++++++ > gcc/testsuite/gcc.dg/stddef-need-rsize-1.c | 35 ++++++++++++++++++++++ > gcc/testsuite/gcc.dg/stddef-need-rsize-2.c | 22 ++++++++++++++ > gcc/testsuite/gcc.dg/stddef-need-rsize-3.c | 7 +++++ > gcc/testsuite/gcc.dg/stddef-need-rsize-4.c | 9 ++++++ > 6 files changed, 105 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/stddef-need-rsize-1.C > create mode 100644 gcc/testsuite/gcc.dg/stddef-need-rsize-1.c > create mode 100644 gcc/testsuite/gcc.dg/stddef-need-rsize-2.c > create mode 100644 gcc/testsuite/gcc.dg/stddef-need-rsize-3.c > create mode 100644 gcc/testsuite/gcc.dg/stddef-need-rsize-4.c > > diff --git a/gcc/ginclude/stddef.h b/gcc/ginclude/stddef.h > index 454e5e9fc..185c6ea18 100644 > --- a/gcc/ginclude/stddef.h > +++ b/gcc/ginclude/stddef.h > @@ -28,14 +28,14 @@ see the files COPYING3 and COPYING.RUNTIME respectively. > If not, see > && !defined(__STDDEF_H__)) \ > || defined(__need_wchar_t) || defined(__need_size_t) \ > || defined(__need_ptrdiff_t) || defined(__need_NULL) \ > - || defined(__need_wint_t) > + || defined(__need_wint_t) || defined(__need_rsize_t) > > /* Any one of these symbols __need_* means that GNU libc > wants us just to define one data type. So don't define > the symbols that indicate this file's entire job has been done. */ > #if (!defined(__need_wchar_t) && !defined(__need_size_t) \ > && !defined(__need_ptrdiff_t) && !defined(__need_NULL) \ > - && !defined(__need_wint_t)) > + && !defined(__need_wint_t) && !defined(__need_rsize_t)) > #define _STDDEF_H > #define _STDDEF_H_ > /* [email protected] says the NeXT needs this. */ > @@ -252,6 +252,21 @@ typedef long ssize_t; > #undef __need_size_t > #endif /* _STDDEF_H or __need_size_t. */ > > +/* Restricted-size type from ISO C11 Annex K. Define it only when a > + system header explicitly requests it via __need_rsize_t. A normal > + inclusion of this header does not provide the type; many C libraries > + do not implement Annex K. RSIZE_MAX and the bounds-checked > + functions remain the C library's responsibility. */ > +#if defined (__need_rsize_t) > +#ifndef _RSIZE_T /* in case the OS headers have defined it. */ > +#define _RSIZE_T > +#ifndef __SIZE_TYPE__ > +#define __SIZE_TYPE__ long unsigned int > +#endif > +typedef __SIZE_TYPE__ rsize_t; > +#endif /* _RSIZE_T */ > +#undef __need_rsize_t > +#endif /* __need_rsize_t. */ > > /* Wide character type. > Locale-writers should change this as necessary to > diff --git a/gcc/testsuite/g++.dg/stddef-need-rsize-1.C > b/gcc/testsuite/g++.dg/stddef-need-rsize-1.C > new file mode 100644 > index 000000000..ffdcc87f8 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/stddef-need-rsize-1.C > @@ -0,0 +1,15 @@ > +/* PR target/126782 */ > +/* Explicit __need_rsize_t must define rsize_t in C++ as well. */ > +/* { dg-do compile } */ > + > +#define __need_rsize_t > +#include <stddef.h> > + > +#ifdef __need_rsize_t > +#error "__need_rsize_t was not consumed" > +#endif > + > +rsize_t value; > + > +extern rsize_t *p; > +extern __SIZE_TYPE__ *p; > diff --git a/gcc/testsuite/gcc.dg/stddef-need-rsize-1.c > b/gcc/testsuite/gcc.dg/stddef-need-rsize-1.c > new file mode 100644 > index 000000000..ed51379f3 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/stddef-need-rsize-1.c > @@ -0,0 +1,35 @@ > +/* PR target/126782 */ > +/* Explicit __need_rsize_t must define rsize_t without completing > + a normal <stddef.h> inclusion. */ > +/* { dg-do compile } */ > + > +#define __need_rsize_t > +#include <stddef.h> > + > +#ifdef __need_rsize_t > +#error "__need_rsize_t was not consumed" > +#endif > + > +#ifdef _STDDEF_H > +#error "partial request must not define _STDDEF_H" > +#endif > + > +#ifdef _STDDEF_H_ > +#error "partial request must not define _STDDEF_H_" > +#endif > + > +#ifndef _RSIZE_T > +#error "_RSIZE_T was not defined" > +#endif > + > +rsize_t value; > + > +extern rsize_t *p; > +extern __SIZE_TYPE__ *p; > + > +#define __need_rsize_t > +#include <stddef.h> > + > +rsize_t again; > + > +size_t missing; /* { dg-error "unknown type name 'size_t'" } */ > diff --git a/gcc/testsuite/gcc.dg/stddef-need-rsize-2.c > b/gcc/testsuite/gcc.dg/stddef-need-rsize-2.c > new file mode 100644 > index 000000000..0bfe5a872 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/stddef-need-rsize-2.c > @@ -0,0 +1,22 @@ > +/* PR target/126782 */ > +/* A later __need_rsize_t request must still define rsize_t after a > + complete <stddef.h> inclusion. */ > +/* { dg-do compile } */ > + > +#include <stddef.h> > + > +#ifndef _STDDEF_H > +#error "full inclusion must define _STDDEF_H" > +#endif > + > +#define __need_rsize_t > +#include <stddef.h> > + > +#ifdef __need_rsize_t > +#error "__need_rsize_t was not consumed" > +#endif > + > +rsize_t value; > + > +extern rsize_t *p; > +extern __SIZE_TYPE__ *p; > diff --git a/gcc/testsuite/gcc.dg/stddef-need-rsize-3.c > b/gcc/testsuite/gcc.dg/stddef-need-rsize-3.c > new file mode 100644 > index 000000000..67f51639d > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/stddef-need-rsize-3.c > @@ -0,0 +1,7 @@ > +/* PR target/126782 */ > +/* A normal <stddef.h> inclusion must not expose rsize_t. */ > +/* { dg-do compile } */ > + > +#include <stddef.h> > + > +rsize_t value; /* { dg-error "unknown type name 'rsize_t'" } */ > diff --git a/gcc/testsuite/gcc.dg/stddef-need-rsize-4.c > b/gcc/testsuite/gcc.dg/stddef-need-rsize-4.c > new file mode 100644 > index 000000000..8638ee67f > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/stddef-need-rsize-4.c > @@ -0,0 +1,9 @@ > +/* PR target/126782 */ > +/* Requesting Annex K interfaces must not, by itself, make this header > + declare rsize_t. */ > +/* { dg-do compile } */ > + > +#define __STDC_WANT_LIB_EXT1__ 1 > +#include <stddef.h> > + > +rsize_t value; /* { dg-error "unknown type name 'rsize_t'" } */ > -- > 2.50.1 (Apple Git-155)
