ImportC: va_arg fails in working C code (#21186)

Fixes https://github.com/dlang/dmd/issues/20423

Ultimate cause of this issue was that va_arg was being shadowed
by the collected template-like macros. As va_arg is not a normal
function (it takes a type as a parameter), this interfered with
the cparser's rewrite of va_arg to a call to the single argument
template version in core.stdc.stdarg.
This commit is contained in:
drpriver 2025-04-10 14:10:31 -07:00 committed by GitHub
parent e9984553e6
commit 493cd034a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 34 additions and 4 deletions

View file

@ -6085,6 +6085,14 @@ final class CParser(AST) : Parser!AST
}
}
void nextLine()
{
// scan to end of line
while (*p)
++p;
++p; // advance to start of next line
}
while (p < endp)
{
//printf("|%s|\n", p);
@ -6096,6 +6104,13 @@ final class CParser(AST) : Parser!AST
if (token.value == TOK.identifier)
{
auto id = token.ident;
// https://github.com/dlang/dmd/issues/20423
// skip macros that could shadow special builtins
if (id == Id.va_arg)
{
nextLine();
continue;
}
const params = *p == '(';
nextToken();
@ -6341,10 +6356,7 @@ final class CParser(AST) : Parser!AST
if (token.value == TOK.identifier)
removeSym(token.ident);
}
// scan to end of line
while (*p)
++p;
++p; // advance to start of next line
nextLine();
}
if (newSymbols.length)

View file

@ -0,0 +1,18 @@
// https://github.com/dlang/dmd/issues/20423
#include <stdarg.h>
#include <stddef.h>
#include <assert.h>
void foo(double * pm, ...) {
va_list ap;
double * targ;
va_start(ap, pm);
for (int i=1; ; i++) {
va_arg(ap, int);
targ = va_arg(ap, double*);
if (targ == NULL) {
break;
}
}
va_end(ap);
}