From e732643b8640bfdc822e2e4bd994977279b2f58b Mon Sep 17 00:00:00 2001 From: lemon Date: Fri, 24 Oct 2025 17:01:57 +0200 Subject: c: also propagate terminates in genswitch --- c/c.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'c/c.c') diff --git a/c/c.c b/c/c.c index 6ae7ee7..fd5da52 100644 --- a/c/c.c +++ b/c/c.c @@ -3426,7 +3426,7 @@ struct switchstmt { vec_of(struct swcase) cases; }; -static void +static bool genswitch(struct comp *cm, struct function *fn, const struct expr *ex) { union ref sel; @@ -3475,8 +3475,15 @@ genswitch(struct comp *cm, struct function *fn, const struct expr *ex) vfree(&st.cases); if (fn->curblk != end) { if (fn->curblk) EMITS putbranch(fn, end); - useblk(fn, end); + if (end->npred > 0) { + useblk(fn, end); + } else { + fn->curblk = NULL; + freeblk(fn, end); + } } + + return fn->curblk == NULL; } static bool /* return 1 if stmt is terminating (ends with a jump) */ @@ -3728,7 +3735,7 @@ stmt(struct comp *cm, struct function *fn) expect(cm, ')', NULL); if (!isint(ex.ty)) error(&ex.span, "'switch' value is not an integer: '%ty'", ex.ty); - genswitch(cm, fn, &ex); + terminates = genswitch(cm, fn, &ex); break; case TKWbreak: lex(cm, &tk); -- cgit v1.2.3