void fold_stmt_case(stmt *t) { intval val; fold_expr(t->expr, t->symtab); fold_need_expr(t->expr, "case", 0); const_fold_need_val(t->expr, &val); t->expr->spel = asm_label_case(CASE_CASE, val.val); fold_stmt_and_add_to_curswitch(t); }
void fold_stmt_case_range(stmt *s) { intval lval, rval; fold_expr(s->expr, s->symtab); fold_expr(s->expr2, s->symtab); const_fold_need_val(s->expr, &lval); const_fold_need_val(s->expr2, &rval); fold_need_expr(s->expr, "case", 0); fold_need_expr(s->expr2, "case", 0); if(lval.val >= rval.val) DIE_AT(&s->where, "case range equal or inverse"); s->expr->spel = asm_label_case(CASE_RANGE, lval.val); fold_stmt_and_add_to_curswitch(s); }
void fold_stmt_case_range(stmt *s) { integral_t lv, rv; FOLD_EXPR(s->expr, s->symtab); FOLD_EXPR(s->expr2, s->symtab); fold_check_expr(s->expr, FOLD_CHK_INTEGRAL | FOLD_CHK_CONST_I, "case-range"); lv = const_fold_val_i(s->expr); fold_check_expr(s->expr2, FOLD_CHK_INTEGRAL | FOLD_CHK_CONST_I, "case-range"); rv = const_fold_val_i(s->expr2); if(lv >= rv) die_at(&s->where, "case range equal or inverse"); s->bits.case_lbl = out_label_case(CASE_RANGE, lv); fold_stmt_and_add_to_curswitch(s, &s->bits.case_lbl); }
void fold_stmt_default(stmt *s) { fold_stmt_and_add_to_curswitch(s, &s->bits.case_lbl); }