From: Michael Forney Subject: [RFC PATCH] Use __builtin_va_list consistently for va_list without __GNUC__ To: tech@openbsd.org Date: Mon, 1 Jun 2026 10:07:11 -0700 Since OpenBSD 6.7, stdarg.h unconditionally defines va_list as __builtin_va_list and uses __builtin_va_* to implement the va_* macros. However, compilers that don't define __GNUC__ now get conflicting definitions for the va_list typedef and the va_list type used in function prototypes like vprintf. To fix this, adjust all definitions of __va_list to match va_list defined in stdarg.h. --- Consider the following example program: #include #include void f(const char *fmt, ...) { va_list ap; va_start(ap, fmt); vprintf(fmt, ap); va_end(ap); } If compiled with -U __GNUC__, we currently end up with typedef __builtin_va_list __gnuc_va_list; typedef __gnuc_va_list va_list; typedef char * __va_list; int vprintf(const char * __restrict, __va_list); which results in a warning when we try to call vprintf due to the the conflicting va_list definition. t.c:10:15: warning: incompatible pointer types passing 'va_list' (aka '__builtin_va_list') to parameter of type '__va_list' (aka 'char *') [-Wincompatible-pointer-types] 10 | vprintf(fmt, ap); | ^~ /usr/include/stdio.h:188:48: note: passing argument to parameter here 188 | int vprintf(const char * __restrict, __va_list); | ^ 1 warning generated. sys/arch/alpha/include/_types.h | 8 -------- sys/arch/amd64/include/_types.h | 4 ---- sys/arch/arm/include/_types.h | 4 ---- sys/arch/arm64/include/_types.h | 4 ---- sys/arch/hppa/include/_types.h | 4 ---- sys/arch/i386/include/_types.h | 4 ---- sys/arch/m88k/include/_types.h | 5 ----- sys/arch/mips64/include/_types.h | 4 ---- sys/arch/powerpc/include/_types.h | 5 ----- sys/arch/powerpc64/include/_types.h | 4 ---- sys/arch/riscv64/include/_types.h | 4 ---- sys/arch/sh/include/_types.h | 5 ----- sys/arch/sparc64/include/_types.h | 4 ---- 13 files changed, 59 deletions(-) diff --git a/sys/arch/alpha/include/_types.h b/sys/arch/alpha/include/_types.h index a2ff372b4dc..9d457ec77c4 100644 --- a/sys/arch/alpha/include/_types.h +++ b/sys/arch/alpha/include/_types.h @@ -122,15 +122,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef struct { - char *__base; - int __offset; - int __pad; -} __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/amd64/include/_types.h b/sys/arch/amd64/include/_types.h index 9856177da81..9b2e8d3a430 100644 --- a/sys/arch/amd64/include/_types.h +++ b/sys/arch/amd64/include/_types.h @@ -122,11 +122,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/arm/include/_types.h b/sys/arch/arm/include/_types.h index 71043162186..57dd3524285 100644 --- a/sys/arch/arm/include/_types.h +++ b/sys/arch/arm/include/_types.h @@ -122,11 +122,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/arm64/include/_types.h b/sys/arch/arm64/include/_types.h index 9661d1e2b20..8f8ab433ab3 100644 --- a/sys/arch/arm64/include/_types.h +++ b/sys/arch/arm64/include/_types.h @@ -123,11 +123,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/hppa/include/_types.h b/sys/arch/hppa/include/_types.h index 1a7a8799fdb..7c456a44cfb 100644 --- a/sys/arch/hppa/include/_types.h +++ b/sys/arch/hppa/include/_types.h @@ -126,11 +126,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef double __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/i386/include/_types.h b/sys/arch/i386/include/_types.h index d879b02fee2..c1cae2f0e29 100644 --- a/sys/arch/i386/include/_types.h +++ b/sys/arch/i386/include/_types.h @@ -122,11 +122,7 @@ typedef long double __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/m88k/include/_types.h b/sys/arch/m88k/include/_types.h index a8a53df0bf4..a637fe0b280 100644 --- a/sys/arch/m88k/include/_types.h +++ b/sys/arch/m88k/include/_types.h @@ -126,12 +126,7 @@ typedef long double __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -struct __va_list_tag; -typedef struct __va_list_tag * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/mips64/include/_types.h b/sys/arch/mips64/include/_types.h index 87e43ebeefe..50930c1e2da 100644 --- a/sys/arch/mips64/include/_types.h +++ b/sys/arch/mips64/include/_types.h @@ -127,11 +127,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/powerpc/include/_types.h b/sys/arch/powerpc/include/_types.h index 001c5c7d37e..62d4618299d 100644 --- a/sys/arch/powerpc/include/_types.h +++ b/sys/arch/powerpc/include/_types.h @@ -122,12 +122,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -struct __va_list_tag; -typedef struct __va_list_tag * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/powerpc64/include/_types.h b/sys/arch/powerpc64/include/_types.h index 7306803d303..8b15ef4591d 100644 --- a/sys/arch/powerpc64/include/_types.h +++ b/sys/arch/powerpc64/include/_types.h @@ -123,11 +123,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/riscv64/include/_types.h b/sys/arch/riscv64/include/_types.h index 6a106c61ffc..408f8760413 100644 --- a/sys/arch/riscv64/include/_types.h +++ b/sys/arch/riscv64/include/_types.h @@ -124,11 +124,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/sh/include/_types.h b/sys/arch/sh/include/_types.h index 9308f2f3a46..b8f247ff254 100644 --- a/sys/arch/sh/include/_types.h +++ b/sys/arch/sh/include/_types.h @@ -122,12 +122,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -struct __va_list_tag; -typedef struct __va_list_tag * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus diff --git a/sys/arch/sparc64/include/_types.h b/sys/arch/sparc64/include/_types.h index fbf0e66d46c..23aff34397c 100644 --- a/sys/arch/sparc64/include/_types.h +++ b/sys/arch/sparc64/include/_types.h @@ -122,11 +122,7 @@ typedef float __float_t; typedef long __ptrdiff_t; typedef unsigned long __size_t; typedef long __ssize_t; -#if defined(__GNUC__) && __GNUC__ >= 3 typedef __builtin_va_list __va_list; -#else -typedef char * __va_list; -#endif /* Wide character support types */ #ifndef __cplusplus -- 2.54.0