From 4d7ea081d3e39ee89be2f36387d55dc43cb04eca Mon Sep 17 00:00:00 2001 From: Martijn Dekker Date: Fri, 14 May 2021 04:36:39 +0200 Subject: [PATCH] Fix build on macOS M1, FreeBSD powerpc64*, et al (?) On some systems, the following won't compile because of the way the macros are defined in the system headers: va_copy(ap, va_listval(va_arg(ap, va_listarg))); The error from clang is something like: .../hashalloc.c:155:16: error: non-const lvalue reference to type '__builtin_va_list' cannot bind to a temporary of type 'va_list' (aka 'char *') va_copy(ap, va_listval(va_arg(ap, va_listarg))); ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./ast_common.h:200:23: note: expanded from macro 'va_listval' #define va_listval(p) (p) ^ .../include/stdarg.h:27:53: note: expanded from macro 'va_copy' #define va_copy(dest, src) __builtin_va_copy(dest, src) ^~~ 1 error generated. mamake [lib/libast]: *** exit code 1 making hashalloc.o This commit backports a FreeBSD build fix from: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=255308 Thanks to Chase for the bug report. src/lib/libast/hash/hashalloc.c, src/lib/libast/string/tokscan.c: - Store va_listval() result in variable and pass that to va_copy(). --- src/lib/libast/hash/hashalloc.c | 4 +++- src/lib/libast/string/tokscan.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lib/libast/hash/hashalloc.c b/src/lib/libast/hash/hashalloc.c index 04d11fdb0..d01a13968 100644 --- a/src/lib/libast/hash/hashalloc.c +++ b/src/lib/libast/hash/hashalloc.c @@ -50,6 +50,7 @@ hashalloc(Hash_table_t* ref, ...) va_list* vp = va; Hash_region_f region = 0; void* handle; + va_listarg tmpval; va_start(ap, ref); @@ -152,7 +153,8 @@ hashalloc(Hash_table_t* ref, ...) va_copy(*vp, ap); vp++; } - va_copy(ap, va_listval(va_arg(ap, va_listarg))); + tmpval = va_listval(va_arg(ap, va_listarg)); + va_copy(ap, tmpval); break; case 0: if (vp > va) diff --git a/src/lib/libast/string/tokscan.c b/src/lib/libast/string/tokscan.c index bea2baf6c..456dc1911 100644 --- a/src/lib/libast/string/tokscan.c +++ b/src/lib/libast/string/tokscan.c @@ -189,6 +189,7 @@ tokscan(register char* s, char** nxt, const char* fmt, ...) char** p_string; char* prv_f = 0; va_list prv_ap; + va_listarg tmpval; va_start(ap, fmt); if (!*s || *s == '\n') @@ -234,7 +235,8 @@ tokscan(register char* s, char** nxt, const char* fmt, ...) prv_f = f; f = va_arg(ap, char*); va_copy(prv_ap, ap); - va_copy(ap, va_listval(va_arg(ap, va_listarg))); + tmpval = va_listval(va_arg(ap, va_listarg)); + va_copy(ap, tmpval); continue; case 'c': p_char = va_arg(ap, char*);