On 2019-03-14 12:38:13 +0100, Torbjorn Granlund wrote: > Is stdarg.h va_end non-empty anywhere?
Yes, with GCC and Clang, for instance. It is defined as: #define va_end(v) __builtin_va_end(v) gcc/builtins.c contains: static rtx expand_builtin_va_end (tree exp) { tree valist = CALL_EXPR_ARG (exp, 0); /* Evaluate for side effects, if needed. I hate macros that don't do that. */ if (TREE_SIDE_EFFECTS (valist)) expand_expr (valist, const0_rtx, VOIDmode, EXPAND_NORMAL); return const0_rtx; } So, if I understand correctly, it does nothing except than taking care of side effects. However, since the C standard explicitly says that va_end is a macro, I'm not sure that having arguments with side effects is allowed. What GCC does is probably safer than doing nothing (without any drawback), though. This means that with GMP, __builtin_va_end(v) would expand to nothing. BTW, I've just fixed a bug in tcc, which did #define va_end(ap) instead of #define va_end(ap) ((void)0) This matters when writing, e.g.: (va_end(ap)); -- Vincent Lefèvre <vinc...@vinc17.net> - Web: <https://www.vinc17.net/> 100% accessible validated (X)HTML - Blog: <https://www.vinc17.net/blog/> Work: CR INRIA - computer arithmetic / AriC project (LIP, ENS-Lyon) _______________________________________________ gmp-bugs mailing list gmp-bugs@gmplib.org https://gmplib.org/mailman/listinfo/gmp-bugs