void c_typecheck_baset::typecheck_return(codet &code) { if(code.operands().empty()) { if(follow(return_type).id()!=ID_empty) { // gcc doesn't actually complain, it just warns! // We'll put a zero here, which is dubious. exprt zero=zero_initializer(return_type, code.source_location(), *this, get_message_handler()); code.copy_to_operands(zero); } } else if(code.operands().size()==1) { typecheck_expr(code.op0()); if(follow(return_type).id()==ID_empty) { // gcc doesn't actually complain, it just warns! if(follow(code.op0().type()).id()!=ID_empty) { warning().source_location=code.source_location(); warning() << "function has return void "; warning() << "but a return statement returning "; warning() << to_string(follow(code.op0().type())); warning() << eom; code.op0().make_typecast(return_type); } } else implicit_typecast(code.op0(), return_type); } else { err_location(code); error() << "return expected to have 0 or 1 operands" << eom; throw 0; } }