Skip to content

Commit 47a3277

Browse files
committed
introduce code_frontend_returnt
This splits the classes that represent return statements in the frontends and the return instructions in goto instructions. They differ in semantics and in the invariants that they maintain. The goto instruction variant always has a return value. The constructors for creating that class without return value are removed.
1 parent 60c9fe5 commit 47a3277

20 files changed

+107
-81
lines changed

jbmc/src/java_bytecode/create_array_with_type_intrinsic.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ codet create_array_with_type_body(
105105
new_array_element_classid, old_array_element_classid));
106106

107107
// return new_array
108-
code_block.add(code_returnt(new_array_symbol_expr));
108+
code_block.add(code_frontend_returnt(new_array_symbol_expr));
109109

110110
return std::move(code_block);
111111
}

jbmc/src/java_bytecode/java_bytecode_convert_method.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1361,7 +1361,7 @@ java_bytecode_convert_methodt::convert_instructions(const methodt &method)
13611361
else if(bytecode == BC_return)
13621362
{
13631363
PRECONDITION(op.empty() && results.empty());
1364-
c=code_returnt();
1364+
c = code_frontend_returnt();
13651365
}
13661366
else if(bytecode == patternt("?return"))
13671367
{
@@ -1370,7 +1370,7 @@ java_bytecode_convert_methodt::convert_instructions(const methodt &method)
13701370
PRECONDITION(op.size() == 1 && results.empty());
13711371
const exprt r =
13721372
typecast_exprt::conditional_cast(op[0], method_return_type);
1373-
c=code_returnt(r);
1373+
c = code_frontend_returnt(r);
13741374
}
13751375
else if(bytecode == patternt("?astore"))
13761376
{

jbmc/src/java_bytecode/java_static_initializers.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ code_blockt get_thread_safe_clinit_wrapper_body(
590590
gen_clinit_eqexpr(
591591
clinit_thread_local_state_sym.symbol_expr(),
592592
clinit_statest::INIT_COMPLETE),
593-
code_returnt());
593+
code_frontend_returnt());
594594
function_body.add(std::move(conditional));
595595
}
596596

@@ -651,7 +651,8 @@ code_blockt get_thread_safe_clinit_wrapper_body(
651651

652652
// if(init_complete) return;
653653
{
654-
code_ifthenelset conditional(init_complete.symbol_expr(), code_returnt());
654+
code_ifthenelset conditional(
655+
init_complete.symbol_expr(), code_frontend_returnt());
655656
function_body.add(std::move(conditional));
656657
}
657658

@@ -696,7 +697,7 @@ code_blockt get_thread_safe_clinit_wrapper_body(
696697
gen_clinit_assign(
697698
clinit_state_sym.symbol_expr(), clinit_statest::INIT_COMPLETE));
698699
function_body.add(atomic_end);
699-
function_body.add(code_returnt());
700+
function_body.add(code_frontend_returnt());
700701
}
701702

702703
return function_body;

src/ansi-c/c_typecheck_base.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ class c_typecheck_baset:
139139
virtual void typecheck_gcc_computed_goto(codet &code);
140140
virtual void typecheck_gcc_switch_case_range(code_gcc_switch_case_ranget &);
141141
virtual void typecheck_gcc_local_label(codet &code);
142-
virtual void typecheck_return(code_returnt &code);
142+
virtual void typecheck_return(code_frontend_returnt &);
143143
virtual void typecheck_switch(codet &code);
144144
virtual void typecheck_while(code_whilet &code);
145145
virtual void typecheck_dowhile(code_dowhilet &code);

src/ansi-c/c_typecheck_code.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ void c_typecheck_baset::typecheck_code(codet &code)
6868
else if(statement==ID_continue)
6969
typecheck_continue(code);
7070
else if(statement==ID_return)
71-
typecheck_return(to_code_return(code));
71+
typecheck_return(to_code_frontend_return(code));
7272
else if(statement==ID_decl)
7373
typecheck_decl(code);
7474
else if(statement==ID_assign)
@@ -643,7 +643,7 @@ void c_typecheck_baset::typecheck_start_thread(codet &code)
643643
typecheck_code(to_code(code.op0()));
644644
}
645645

646-
void c_typecheck_baset::typecheck_return(code_returnt &code)
646+
void c_typecheck_baset::typecheck_return(code_frontend_returnt &code)
647647
{
648648
if(code.has_return_value())
649649
{

src/ansi-c/expr2c.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2680,7 +2680,7 @@ std::string expr2ct::convert_code_return(
26802680
std::string dest=indent_str(indent);
26812681
dest+="return";
26822682

2683-
if(to_code_return(src).has_return_value())
2683+
if(to_code_frontend_return(src).has_return_value())
26842684
dest+=" "+convert(src.op0());
26852685

26862686
dest+=';';

src/cpp/cpp_typecheck_compound_type.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -688,8 +688,8 @@ void cpp_typecheckt::typecheck_compound_declarator(
688688
{
689689
expr_call.type()=to_code_type(component.type()).return_type();
690690

691-
func_symb.value = code_blockt{
692-
{code_returnt(already_typechecked_exprt{std::move(expr_call)})}};
691+
func_symb.value = code_blockt{{code_frontend_returnt(
692+
already_typechecked_exprt{std::move(expr_call)})}};
693693
}
694694
else
695695
{

src/cpp/parse.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7350,7 +7350,7 @@ optionalt<codet> Parser::rStatement()
73507350

73517351
lex.get_token(tk1);
73527352

7353-
code_returnt statement;
7353+
code_frontend_returnt statement;
73547354
set_location(statement, tk1);
73557355

73567356
if(lex.LookAhead(0)==';')

src/goto-harness/recursive_initialization.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ code_blockt build_null_pointer(const symbol_exprt &result_symbol)
239239
const null_pointer_exprt nullptr_expr{to_pointer_type(type_to_construct)};
240240
const code_assignt assign_null{dereference_exprt{result_symbol},
241241
nullptr_expr};
242-
return code_blockt{{assign_null, code_returnt{}}};
242+
return code_blockt{{assign_null, code_frontend_returnt{}}};
243243
}
244244

245245
code_blockt recursive_initializationt::build_constructor_body(
@@ -688,7 +688,7 @@ code_blockt recursive_initializationt::build_pointer_constructor(
688688

689689
null_pointer_exprt nullptr_expr{pointer_type(type.subtype())};
690690
const code_assignt assign_null{dereference_exprt{result}, nullptr_expr};
691-
code_blockt null_and_return{{assign_null, code_returnt{}}};
691+
code_blockt null_and_return{{assign_null, code_frontend_returnt{}}};
692692
body.add(code_ifthenelset{conjunction(should_not_recurse), null_and_return});
693693

694694
const auto should_recurse_nondet =
@@ -1034,7 +1034,7 @@ code_blockt recursive_initializationt::build_function_pointer_constructor(
10341034
auto const condition = equal_exprt{
10351035
function_pointer_selector,
10361036
from_integer(function_pointer_index, function_pointer_selector.type())};
1037-
auto const then = code_blockt{{assign, code_returnt{}}};
1037+
auto const then = code_blockt{{assign, code_frontend_returnt{}}};
10381038
body.add(code_ifthenelset{condition, then});
10391039
}
10401040
else

src/goto-instrument/contracts/contracts.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,7 +1074,7 @@ void code_contractst::add_contract_check(
10741074
replace_symbolt common_replace;
10751075

10761076
// decl ret
1077-
code_returnt return_stmt;
1077+
optionalt<code_returnt> return_stmt;
10781078
if(code_type.return_type() != empty_typet())
10791079
{
10801080
symbol_exprt r = new_tmp_symbol(
@@ -1178,7 +1178,8 @@ void code_contractst::add_contract_check(
11781178

11791179
if(code_type.return_type() != empty_typet())
11801180
{
1181-
check.add(goto_programt::make_return(return_stmt, skip->source_location()));
1181+
check.add(
1182+
goto_programt::make_return(return_stmt.value(), skip->source_location()));
11821183
}
11831184

11841185
// prepend the new code to dest

0 commit comments

Comments
 (0)