void c_typecheck_baset::typecheck_switch(code_switcht &code) { if(code.operands().size()!=2) { err_location(code); error() << "switch expects two operands" << eom; throw 0; } typecheck_expr(code.value()); // this needs to be promoted implicit_typecast_arithmetic(code.value()); // save & set flags bool old_case_is_allowed(case_is_allowed); bool old_break_is_allowed(break_is_allowed); typet old_switch_op_type(switch_op_type); switch_op_type=code.value().type(); break_is_allowed=case_is_allowed=true; typecheck_code(code.body()); // restore flags case_is_allowed=old_case_is_allowed; break_is_allowed=old_break_is_allowed; switch_op_type=old_switch_op_type; }
void c_typecastt::implicit_typecast_arithmetic( exprt &expr1, exprt &expr2) { const typet &type1=ns.follow(expr1.type()); const typet &type2=ns.follow(expr2.type()); c_typet c_type1=get_c_type(type1), c_type2=get_c_type(type2); c_typet max_type=std::max(c_type1, c_type2); // "If an int can represent all values of the original type, the // value is converted to an int; otherwise, it is converted to // an unsigned int." // The second case can arise if we promote any unsigned type // that is as large as unsigned int. if(config.ansi_c.short_int_width==config.ansi_c.int_width && max_type==USHORT) max_type=UINT; else if(config.ansi_c.char_width==config.ansi_c.int_width && max_type==UCHAR) max_type=UINT; else max_type=std::max(max_type, INT); if(max_type==LARGE_SIGNED_INT || max_type==LARGE_UNSIGNED_INT) { // get the biggest width of both unsigned width1=type1.get_int(ID_width); unsigned width2=type2.get_int(ID_width); // produce type typet result_type; if(width1==width2) { if(max_type==LARGE_SIGNED_INT) result_type=signedbv_typet(width1); else result_type=unsignedbv_typet(width1); } else if(width1>width2) result_type=type1; else // width1<width2 result_type=type2; do_typecast(expr1, result_type); do_typecast(expr2, result_type); return; } else if(max_type==COMPLEX) { if(c_type1==COMPLEX && c_type2==COMPLEX) { // promote to the one with bigger subtype if(get_c_type(type1.subtype())>get_c_type(type2.subtype())) do_typecast(expr2, type1); else do_typecast(expr1, type2); } else if(c_type1==COMPLEX) { assert(c_type1==COMPLEX && c_type2!=COMPLEX); do_typecast(expr2, type1.subtype()); do_typecast(expr2, type1); } else { assert(c_type1!=COMPLEX && c_type2==COMPLEX); do_typecast(expr1, type2.subtype()); do_typecast(expr1, type2); } return; } implicit_typecast_arithmetic(expr1, max_type); implicit_typecast_arithmetic(expr2, max_type); if(max_type==PTR) { if(c_type1==VOIDPTR) do_typecast(expr1, expr2.type()); if(c_type2==VOIDPTR) do_typecast(expr2, expr1.type()); } }
void c_typecastt::implicit_typecast_arithmetic(exprt &expr) { c_typet c_type=get_c_type(expr.type()); c_type=std::max(c_type, INT); // minimum promotion implicit_typecast_arithmetic(expr, c_type); }
void c_typecastt::implicit_typecast_arithmetic( exprt &expr1, exprt &expr2) { const typet &type1=ns.follow(expr1.type()); const typet &type2=ns.follow(expr2.type()); c_typet c_type1=minimum_promotion(type1), c_type2=minimum_promotion(type2); c_typet max_type=std::max(c_type1, c_type2); if(max_type==LARGE_SIGNED_INT || max_type==LARGE_UNSIGNED_INT) { // get the biggest width of both unsigned width1=type1.get_int(ID_width); unsigned width2=type2.get_int(ID_width); // produce type typet result_type; if(width1==width2) { if(max_type==LARGE_SIGNED_INT) result_type=signedbv_typet(width1); else result_type=unsignedbv_typet(width1); } else if(width1>width2) result_type=type1; else // width1<width2 result_type=type2; do_typecast(expr1, result_type); do_typecast(expr2, result_type); return; } else if(max_type==COMPLEX) { if(c_type1==COMPLEX && c_type2==COMPLEX) { // promote to the one with bigger subtype if(get_c_type(type1.subtype())>get_c_type(type2.subtype())) do_typecast(expr2, type1); else do_typecast(expr1, type2); } else if(c_type1==COMPLEX) { assert(c_type1==COMPLEX && c_type2!=COMPLEX); do_typecast(expr2, type1.subtype()); do_typecast(expr2, type1); } else { assert(c_type1!=COMPLEX && c_type2==COMPLEX); do_typecast(expr1, type2.subtype()); do_typecast(expr1, type2); } return; } else if(max_type==SINGLE || max_type==DOUBLE || max_type==LONGDOUBLE || max_type==FLOAT128) { // Special-case optimisation: // If we have two non-standard sized floats, don't do implicit type // promotion if we can possibly avoid it. if(type1==type2) return; } implicit_typecast_arithmetic(expr1, max_type); implicit_typecast_arithmetic(expr2, max_type); if(max_type==PTR) { if(c_type1==VOIDPTR) do_typecast(expr1, expr2.type()); if(c_type2==VOIDPTR) do_typecast(expr2, expr1.type()); } }
void c_typecastt::implicit_typecast_arithmetic(exprt &expr) { c_typet c_type=minimum_promotion(expr.type()); implicit_typecast_arithmetic(expr, c_type); }