From add8ae695df12297c12f0d3ddb809e5fdf4ae440 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 20 Aug 2020 19:36:49 +0900 Subject: [PATCH] Expand macros in the #if and #elif argument context --- preprocess.c | 4 ++++ test/macro.c | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/preprocess.c b/preprocess.c index 82a0ef3..bfaa9b5 100644 --- a/preprocess.c +++ b/preprocess.c @@ -20,6 +20,8 @@ struct CondIncl { static Macro *macros; static CondIncl *cond_incl; +static Token *preprocess2(Token *tok); + static char *format(char *fmt, ...) { va_list ap; va_start(ap, fmt); @@ -31,6 +33,7 @@ static char *format(char *fmt, ...) { fclose(out); return buf; } + static bool is_hash(Token *tok) { return tok->at_bol && equal(tok, "#"); } @@ -124,6 +127,7 @@ static Token *copy_line(Token **rest, Token *tok) { static long eval_const_expr(Token **rest, Token *tok) { Token *start = tok; Token *expr = copy_line(rest, tok->next); + expr = preprocess2(expr); if (expr->kind == TK_EOF) error_tok(start, "no expression"); diff --git a/test/macro.c b/test/macro.c index 6481464..61447f6 100644 --- a/test/macro.c +++ b/test/macro.c @@ -128,6 +128,22 @@ int main() { if (0); +#define M 5 +#if M + m = 5; +#else + m = 6; +#endif + assert(5, m, "m"); + +#define M 5 +#if M-5 + m = 6; +#elif M + m = 5; +#endif + assert(5, m, "m"); + printf("OK\n"); return 0; } -- GitLab