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:
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 *);