From 29cfc017cad90d2755ddabc3a642267923e6a21f Mon Sep 17 00:00:00 2001 From: Michael Forney Date: Sat, 6 Apr 2019 22:49:23 -0700 Subject: expr: Handle parenthesized paremeter name in __builtin_va_start FreeBSD defines va_start(ap, last)=__builtin_va_start((ap), (last)) --- expr.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/expr.c b/expr.c index f8b2c05..186e30e 100644 --- a/expr.c +++ b/expr.c @@ -395,7 +395,7 @@ static struct expr *condexpr(struct scope *); static struct expr * builtinfunc(struct scope *s, enum builtinkind kind) { - struct expr *e; + struct expr *e, *param; struct type *t; char *name; uint64_t offset; @@ -458,7 +458,10 @@ builtinfunc(struct scope *s, enum builtinkind kind) e->builtin.kind = BUILTINVASTART; e->builtin.arg = exprconvert(assignexpr(s), &typevalistptr); expect(TCOMMA, "after va_list"); - free(expect(TIDENT, "after ','")); + param = assignexpr(s); + if (param->kind != EXPRIDENT) + error(&tok.loc, "expected parameter identifier"); + delexpr(param); // XXX: check that this was actually a parameter name? break; default: -- cgit v1.2.3