void fold_stmt_break_continue(stmt *t, char *lbl) { if(!lbl) DIE_AT(&t->where, "%s outside a flow-control statement", t->f_str()); t->expr = expr_new_identifier(lbl); t->expr->tree_type = decl_new_void(); }
static void parse_test_init_expr(stmt *t, struct stmt_ctx *ctx) { where here; where_cc1_current(&here); EAT(token_open_paren); /* if C99, we create a new scope here, for e.g. * if(5 > (enum { a, b })a){ return a; } return b; * "return b" can't see 'b' since its scope is only the if * * C90 drags the scope of the enum up to the enclosing block */ if(cc1_std >= STD_C99){ ctx->scope = t->symtab = symtab_new(t->symtab, &here); } if(parse_at_decl(ctx->scope, 1)){ decl *d; /* if we are at a type, push a scope for it, for * for(int i ...), if(int i = ...) etc */ symtable *init_scope = symtab_new(t->symtab, &here); t->flow = stmt_flow_new(init_scope); d = parse_decl( DECL_SPEL_NEED, 0, init_scope, init_scope); UCC_ASSERT(d, "at decl, but no decl?"); UCC_ASSERT( t->flow->for_init_symtab == init_scope, "wrong scope for stmt-init"); flow_fold(t->flow, &t->symtab); ctx->scope = t->symtab; /* `d' is added to the scope implicitly */ if(accept(token_comma)){ /* if(int i = 5, i > f()){ ... } */ t->expr = parse_expr_exp(ctx->scope, 0); }else{ /* if(int i = 5) -> if(i) */ t->expr = expr_new_identifier(d->spel); } }else{ t->expr = parse_expr_exp(t->symtab, 0); } FOLD_EXPR(t->expr, t->symtab); EAT(token_close_paren); }