1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

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 <nicetrynsa@protonmail.ch> 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().
This commit is contained in:
Martijn Dekker 2021-05-14 04:36:39 +02:00
parent 53f4bc6a53
commit 4d7ea081d3
2 changed files with 6 additions and 2 deletions

View file

@ -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)

View file

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