From a292164e0a590d5ddcab97b07c490983ba5eeaac Mon Sep 17 00:00:00 2001 From: lemon Date: Thu, 6 Nov 2025 09:19:00 +0100 Subject: c: do fold conditional exprs --- c/c.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'c') diff --git a/c/c.c b/c/c.c index 2c3aea0..d95ec83 100644 --- a/c/c.c +++ b/c/c.c @@ -3376,6 +3376,14 @@ compileexpr(struct function *fn, const struct expr *ex, bool discard) return narrow(fn, cls, ex->ty, r, 0); return r; case ECOND: + if (eval(&ex->sub[0], EVFOLD)) { + bool k = isflt(ex->sub[0].ty) ? ex->sub[0].f != 0.0 : ex->sub[0].u != 0; + assert(ex->sub[0].t == ENUMLIT); + r = compileexpr(fn, &ex->sub[2-k], discard); + if (discard) return NOREF; + return cvt(fn, ex->ty, ex->sub[2-k].ty, r); + } + if (ex->ty.t == TYVOID || discard) { struct block *tr, *fl, *end; condjump(fn, &sub[0], tr = newblk(fn), fl = newblk(fn)); @@ -3389,9 +3397,16 @@ compileexpr(struct function *fn, const struct expr *ex, bool discard) useblk(fn, end); return NOREF; } - /* fallthru */ + return condexprvalue(fn, ex, discard); case ELOGAND: case ELOGIOR: + if (eval(&ex->sub[0], EVFOLD)) { + bool k = isflt(ex->sub[0].ty) ? ex->sub[0].f != 0.0 : ex->sub[0].u != 0; + assert(ex->sub[0].t == ENUMLIT); + r = compileexpr(fn, &ex->sub[k], discard); + if (discard) return NOREF; + return cvt(fn, mktype(TYBOOL), ex->sub[k].ty, r); + } return condexprvalue(fn, ex, discard); case ESEQ: expreffects(fn, &sub[0]); -- cgit v1.2.3