devel/arm-none-eabi-newlib headers inconsistencies (not functional) or am I misusing something?

From: José_Pérez <fbl_at_aoek.com>
Date: Fri, 26 May 2023 16:53:15 UTC
Hi,
a source as simple as this does not compile with 
devel/arm-none-eabi-newlib installed

#include <stdio.h>

int main(int argc, char *argv[]) {
   return 0;
}

% arm-none-eabi-gcc break_arm.c
In file included from break_arm.c:1:
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:59:26: 
error: expected ';' before 'typedef'
    59 | __NULLABILITY_PRAGMA_PUSH
       |                          ^
       |                          ;
    60 |
    61 | typedef __off_t         fpos_t;
       | ~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:61:9: 
error: unknown type name '__off_t'
    61 | typedef __off_t         fpos_t;
       |         ^~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:76:9: 
error: unknown type name '__off_t'
    76 | typedef __off_t         off_t;
       |         ^~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:80:9: 
error: unknown type name '__ssize_t'
    80 | typedef __ssize_t       ssize_t;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:86:9: 
error: unknown type name '__off64_t'
    86 | typedef __off64_t       off64_t;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:91:9: 
error: unknown type name '__va_list'
    91 | typedef __va_list __not_va_list__;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:149:29: 
error: expected ')' before '_close'
   149 |         int     (* _Nullable _close)(void *);
       |                             ^~~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:150:29: 
error: expected ')' before '_read'
   150 |         int     (* _Nullable _read)(void *, char *, int);
       |                             ^~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:151:29: 
error: expected ')' before '_seek'
   151 |         fpos_t  (* _Nullable _seek)(void *, fpos_t, int);
       |                             ^~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:152:29: 
error: expected ')' before '_write'
   152 |         int     (* _Nullable _write)(void *, const char *, int);
       |                             ^~~~~~~
       |                             )
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:174:9: 
error: unknown type name '__mbstate_t'
   174 |         __mbstate_t _mbstate;   /* multibyte conversion state */
       |         ^~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:373:25: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   373 | int      fseeko(FILE *, __off_t, int);
       |                         ^~~~~~~
       |                         _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:374:1: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   374 | __off_t  ftello(FILE *);
       | ^~~~~~~
       | _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:427:20: 
error: conflicting types for '_Nullable'; have 'int (*)(void *, const 
char *, int)'
   427 |             int (* _Nullable)(void *, const char *, int),
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:426:20: 
note: previous definition of '_Nullable' with type 'int (*)(void *, char 
*, int)'
   426 |             int (* _Nullable)(void *, char *, int),
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:428:23: 
error: conflicting types for '_Nullable'; have 'fpos_t (*)(void *, 
fpos_t,  int)' {aka 'int (*)(void *, int,  int)'}
   428 |             fpos_t (* _Nullable)(void *, fpos_t, int),
       |             ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:427:20: 
note: previous definition of '_Nullable' with type 'int (*)(void *, 
const char *, int)'
   427 |             int (* _Nullable)(void *, const char *, int),
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:429:20: 
error: conflicting types for '_Nullable'; have 'int (*)(void *)'
   429 |             int (* _Nullable)(void *));
       |             ~~~~~~~^~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:428:23: 
note: previous definition of '_Nullable' with type 'fpos_t (*)(void *, 
fpos_t,  int)' {aka 'int (*)(void *, int,  int)'}
   428 |             fpos_t (* _Nullable)(void *, fpos_t, int),
       |             ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:433:9: 
error: unknown type name '__ssize_t'
   433 | typedef __ssize_t cookie_read_function_t(void *, char *, 
size_t);
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:434:9: 
error: unknown type name '__ssize_t'
   434 | typedef __ssize_t cookie_write_function_t(void *, const char *, 
size_t);
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:450:25: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   450 | int      ftruncate(int, __off_t);
       |                         ^~~~~~~
       |                         _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:454:1: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   454 | __off_t  lseek(int, __off_t, int);
       | ^~~~~~~
       | _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:454:21: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   454 | __off_t  lseek(int, __off_t, int);
       |                     ^~~~~~~
       |                     _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:458:46: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   458 | void    *mmap(void *, size_t, int, int, int, __off_t);
       |                                              ^~~~~~~
       |                                              _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:462:33: 
error: unknown type name '__off_t'; did you mean '_off_t'?
   462 | int      truncate(const char *, __off_t);
       |                                 ^~~~~~~
       |                                 _off_t
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:546:25: 
error: expected ';' before 'int'
   546 | __NULLABILITY_PRAGMA_POP
       |                         ^
       |                         ;


Regarding the first error it seems that __NULLABILITY_PRAGMA_PUSH is not 
defined in the headers of devel/arm-none-eabi-*. I managed to work the 
issue around by copying and pasting this from /usr/include/sys/cdefs.h 
at the end of /usr/local/arm-none-eabi/include/sys/cdefs.h
/*
  * Nullability qualifiers: currently only supported by Clang.
  */
#if !(defined(__clang__) && __has_feature(nullability))
#define _Nonnull
#define _Nullable
#define _Null_unspecified
#define __NULLABILITY_PRAGMA_PUSH
#define __NULLABILITY_PRAGMA_POP
#else
#define __NULLABILITY_PRAGMA_PUSH _Pragma("clang diagnostic push")      
\
         _Pragma("clang diagnostic ignored 
\"-Wnullability-completeness\"")
#define __NULLABILITY_PRAGMA_POP _Pragma("clang diagnostic pop")
#endif

But this workaround looks quite odd to me because, as the comment itself 
mentions, this is a clang only thing and we are on gcc, so maybe we 
shall instead remove all the __NULLABILITY_PRAGMA_PUSHes and 
__NULLABILITY_PRAGMA_POPs from the arm-none-eabi-* ports headers?


Regarding the typedef errors, I am unsure on how to proceed: for example 
__off_t is defined here 
/usr/local/arm-none-eabi/include/machine/types.h:19 typedef long int 
__off_t; but this header is not included by stdio.h.

If I force the inclusion, i.e.
#include <machine/types.h>
#include <stdio.h>
...

the corresponding error goes away, but the following errors remain:
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:80:9: 
error: unknown type name '__ssize_t'
    80 | typedef __ssize_t       ssize_t;
       |         ^~~~~~~~~
/usr/local/lib/gcc/arm-none-eabi/11.3.0/include-fixed/stdio.h:86:9: 
error: unknown type name '__off64_t'
    86 | typedef __off64_t       off64_t;
       |         ^~~~~~~~~
...
(others similar follow)

__ssize_t nor __off64_t are not typedef'd anywhere in 
/usr/local/arm-none-eabi (devel/arm-none-eabi-newlib) nor 
/usr/local/lib/gcc/arm-none-eabi/11.3.0 (devel/arm-none-eabi-gcc). They 
are typedef'd in default /usr/include/sys/_types.h which is not in the 
search path, so it seems that the arm-none-eabi-* ports are not self 
sufficient. Maybe there is a missing dependency?

Any suggestion?

BR,

-- 
José Pérez