aboutsummaryrefslogtreecommitdiffhomepage
path: root/c
diff options
context:
space:
mode:
Diffstat (limited to 'c')
-rw-r--r--c/c.c13
1 files changed, 10 insertions, 3 deletions
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);