This diff changes stdarg.h's va_arg and va_end macros to be defined as function-like macros rather than object-like macros.
The C standard does not explicitly require va_arg and va_end to be function-like macros, but some of the wording appears to implicitly require it. E.g., section 7.15.1.1.2 says: The va_arg macro expands to an expression that has the specified type and the value of the next argument in the call. Strictly speaking, if va_arg is an object-like macro, its expansion will not be an expression of the specified type (or any type, as __built_va_arg is simply a GCC-extension keyword and is not considered by itself an expression). This diff allows (questionable, but technically legal) code that uses va_arg as a local variable name to compile. ok? Index: sys/arch/arm/include/stdarg.h =================================================================== RCS file: /cvs/src/sys/arch/arm/include/stdarg.h,v retrieving revision 1.7 diff -u -p sys/arch/arm/include/stdarg.h --- sys/arch/arm/include/stdarg.h 23 Oct 2008 21:25:07 -0000 1.7 +++ sys/arch/arm/include/stdarg.h 1 Mar 2011 00:29:48 -0000 @@ -49,8 +49,8 @@ typedef __va_list va_list; #define va_start(ap, last) __builtin_stdarg_start((ap), (last)) -#define va_arg __builtin_va_arg -#define va_end __builtin_va_end +#define va_arg(ap, type) __builtin_va_arg((ap), type) +#define va_end(ap) __builtin_va_end((ap)) #define __va_copy(dest, src) __builtin_va_copy((dest), (src)) #endif /* !_ARM32_STDARG_H_ */ Index: sys/arch/sh/include/stdarg.h =================================================================== RCS file: /cvs/src/sys/arch/sh/include/stdarg.h,v retrieving revision 1.2 diff -u -p sys/arch/sh/include/stdarg.h --- sys/arch/sh/include/stdarg.h 23 Oct 2008 21:25:07 -0000 1.2 +++ sys/arch/sh/include/stdarg.h 1 Mar 2011 00:29:48 -0000 @@ -49,8 +49,8 @@ typedef __va_list va_list; #endif #define va_start(ap, last) __builtin_stdarg_start((ap), (last)) -#define va_arg __builtin_va_arg -#define va_end __builtin_va_end +#define va_arg(ap, type) __builtin_va_arg((ap), type) +#define va_end(ap) __builtin_va_end((ap)) #define __va_copy(dest, src) __builtin_va_copy((dest), (src)) #endif /* !_SH_STDARG_H_ */ Index: sys/sys/stdarg.h =================================================================== RCS file: /cvs/src/sys/sys/stdarg.h,v retrieving revision 1.7 diff -u -p sys/sys/stdarg.h --- sys/sys/stdarg.h 17 Sep 2009 20:46:55 -0000 1.7 +++ sys/sys/stdarg.h 1 Mar 2011 00:29:48 -0000 @@ -34,8 +34,8 @@ typedef __builtin_va_list __gnuc_va_list; Thus, va_arg (..., short) is not valid. */ #define va_start(ap, last) __builtin_va_start((ap), last) -#define va_end __builtin_va_end -#define va_arg __builtin_va_arg +#define va_end(ap) __builtin_va_end((ap)) +#define va_arg(ap, type) __builtin_va_arg((ap), type) #define __va_copy(dst, src) __builtin_va_copy((dst),(src)) typedef __gnuc_va_list va_list;