diff --git a/preprocess.c b/preprocess.c index 82a0ef383333f46c6c964944f47c116869bae9f6..bfaa9b55be09e7ad9544e59502f0b8d0494d556c 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 6481464a2438eace6bc5138f4b2598a20231d2bf..61447f6efca67dbf4809402f029926672fa74b49 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; }