scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | LICENSE

commit 01ff22e4c7a52753acf510e0ce89862298b3a042
parent 31309470ae9ffedac7666d0286b1659c13a6fa25
Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
Date:   Fri, 20 Oct 2023 12:08:08 +0200

libc: Avoid inclusion order for va_list

Libc headers were designed to expose functions using va_list
only if stdarg.h was included before. This can be consistent
with the writing of the standard that is not very clear about
this topic, but it can be a bit confusing for some users.

Diffstat:
Minclude/bits/amd64/arch/cdefs.h | 8++++++++
Minclude/bits/arm/arch/cdefs.h | 8++++++++
Minclude/bits/arm64/arch/cdefs.h | 8++++++++
Minclude/bits/i386/arch/cdefs.h | 8++++++++
Minclude/bits/ppc/arch/cdefs.h | 8++++++++
Minclude/bits/z80/arch/cdefs.h | 8++++++++
Minclude/stdarg.h | 6+++++-
Minclude/stdio.h | 17++++++++---------
Minclude/wchar.h | 17+++++++----------
9 files changed, 68 insertions(+), 20 deletions(-)

diff --git a/include/bits/amd64/arch/cdefs.h b/include/bits/amd64/arch/cdefs.h @@ -1,3 +1,11 @@ +#ifdef _NEED_VA_LIST +#ifndef _VA_LIST +typedef __builtin_va_list __va_list; +#define _VA_LIST +#endif +#undef _NEED_VA_LIST +#endif + #ifdef _NEED_SIZET #ifndef _SIZET typedef unsigned long size_t; diff --git a/include/bits/arm/arch/cdefs.h b/include/bits/arm/arch/cdefs.h @@ -1,3 +1,11 @@ +#ifdef _NEED_VA_LIST +#ifndef _VA_LIST +typedef __builtin_va_list __va_list; +#define _VA_LIST +#endif +#undef _NEED_VA_LIST +#endif + #ifdef _NEED_SIZET #ifndef _SIZET typedef unsigned long size_t; diff --git a/include/bits/arm64/arch/cdefs.h b/include/bits/arm64/arch/cdefs.h @@ -1,3 +1,11 @@ +#ifdef _NEED_VA_LIST +#ifndef _VA_LIST +typedef __builtin_va_list __va_list; +#define _VA_LIST +#endif +#undef _NEED_VA_LIST +#endif + #ifdef _NEED_SIZET #ifndef _SIZET typedef unsigned long size_t; diff --git a/include/bits/i386/arch/cdefs.h b/include/bits/i386/arch/cdefs.h @@ -1,3 +1,11 @@ +#ifdef _NEED_VA_LIST +#ifndef _VA_LIST +typedef __builtin_va_list __va_list; +#define _VA_LIST +#endif +#undef _NEED_VA_LIST +#endif + #ifdef _NEED_SIZET #ifndef _SIZET typedef unsigned long size_t; diff --git a/include/bits/ppc/arch/cdefs.h b/include/bits/ppc/arch/cdefs.h @@ -1,3 +1,11 @@ +#ifdef _NEED_VA_LIST +#ifndef _VA_LIST +typedef __builtin_va_list __va_list; +#define _VA_LIST +#endif +#undef _NEED_VA_LIST +#endif + #ifdef _NEED_SIZET #ifndef _SIZET typedef unsigned size_t; diff --git a/include/bits/z80/arch/cdefs.h b/include/bits/z80/arch/cdefs.h @@ -1,3 +1,11 @@ +#ifdef _NEED_VA_LIST +#ifndef _VA_LIST +typedef __builtin_va_list __va_list; +#define _VA_LIST +#endif +#undef _NEED_VA_LIST +#endif + #ifdef _NEED_SIZET #ifndef _SIZET typedef unsigned short size_t; diff --git a/include/stdarg.h b/include/stdarg.h @@ -1,7 +1,11 @@ #ifndef _STDARG_H #define _STDARG_H -typedef __builtin_va_list va_list; +#define _NEED_VA_LIST +#include <arch/cdefs.h> + +typedef __va_list va_list; + #define va_start(ap, last) __builtin_va_start(ap, last) #define va_end(ap) __builtin_va_end(ap) #define va_copy(to, from) __builtin_va_copy(to, from) diff --git a/include/stdio.h b/include/stdio.h @@ -3,6 +3,7 @@ #define _NEED_NULL #define _NEED_SIZET +#define _NEED_VA_LIST #include <sys/stdio.h> #include <arch/cdefs.h> @@ -90,15 +91,13 @@ extern int snprintf(char *restrict, size_t, const char *restrict, ...); extern int sprintf(char *restrict, const char *restrict, ...); extern int sscanf(const char *restrict, const char *restrict, ...); -#ifdef _STDARG_H -extern int vfprintf(FILE *restrict, const char *restrict, va_list); -extern int vfscanf(FILE *restrict, const char *restrict, va_list); -extern int vprintf(const char *restrict, va_list); -extern int vscanf(const char *restrict, va_list); -extern int vsnprintf(char *restrict, size_t, const char *restrict, va_list); -extern int vsprintf(char *restrict, const char *restrict, va_list); -extern int vsscanf(const char *restrict, const char *restrict, va_list); -#endif +extern int vfprintf(FILE *restrict, const char *restrict, __va_list); +extern int vfscanf(FILE *restrict, const char *restrict, __va_list); +extern int vprintf(const char *restrict, __va_list); +extern int vscanf(const char *restrict, __va_list); +extern int vsnprintf(char *restrict, size_t, const char *restrict, __va_list); +extern int vsprintf(char *restrict, const char *restrict, __va_list); +extern int vsscanf(const char *restrict, const char *restrict, __va_list); extern int fgetc(FILE *); extern char *fgets(char *restrict, int, FILE *restrict); diff --git a/include/wchar.h b/include/wchar.h @@ -7,6 +7,7 @@ #define _NEED_WEOF #define _NEED_WCHARLIM #define _NEED_WINT +#define _NEED_VA_LIST #include <sys/cdefs.h> #include <arch/cdefs.h> @@ -18,21 +19,17 @@ typedef int mbstate_t; struct tm; -#ifdef _STDARG_H -extern int vswscanf(const wchar_t *restrict, const wchar_t *restrict, va_list); -extern int vwprintf(const wchar_t *restrict, va_list); -extern int vwscanf(const wchar_t *restrict format, va_list); -#endif +extern int vswscanf(const wchar_t *restrict, const wchar_t *restrict, __va_list); +extern int vwprintf(const wchar_t *restrict, __va_list); +extern int vwscanf(const wchar_t *restrict format, __va_list); #ifdef _STDIO_H extern int fwprintf(FILE *restrict, const wchar_t *restrict, ...); extern int fwscanf(FILE *restrict, const wchar_t *restrict, ...); -#ifdef _STDARG_H -extern int vfwprintf(FILE *restrict, const wchar_t *restrict, va_list); -extern int vfwscanf(FILE *restrict, const wchar_t *restrict, va_list); -extern int vswprintf(wchar_t *restrict, size_t, const wchar_t *restrict, va_list); -#endif +extern int vfwprintf(FILE *restrict, const wchar_t *restrict, __va_list); +extern int vfwscanf(FILE *restrict, const wchar_t *restrict, __va_list); +extern int vswprintf(wchar_t *restrict, size_t, const wchar_t *restrict, __va_list); extern wint_t fgetwc(FILE *); extern wint_t fputwc(wchar_t c, FILE *);