Skip to content

Commit 10acc4b

Browse files
committed
Fix virtual table construction
Functions are expected to have code_blockt values, don't do duplicate type checking, parameters are in the symbol table already, don't use code_function_callt.
1 parent 77f9fa2 commit 10acc4b

File tree

3 files changed

+32
-28
lines changed

3 files changed

+32
-28
lines changed

regression/cpp/virtual1/test.desc

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
KNOWNBUG
1+
CORE
22
main.cpp
33

44
^EXIT=0$

src/cpp/cpp_typecheck_compound_type.cpp

+19-26
Original file line numberDiff line numberDiff line change
@@ -614,42 +614,33 @@ void cpp_typecheckt::typecheck_compound_declarator(
614614
lookup(args[0].get(ID_C_identifier)).symbol_expr(),
615615
to_code_type(component.type()).parameters()[0].type());
616616

617+
side_effect_expr_function_callt expr_call;
618+
expr_call.function()=
619+
symbol_exprt(component.get_name(), component.type());
620+
expr_call.arguments().reserve(args.size());
621+
expr_call.arguments().push_back(late_cast);
622+
623+
for(std::size_t i=1; i < args.size(); i++)
624+
{
625+
expr_call.arguments().push_back(
626+
lookup(args[i].get(ID_C_identifier)).symbol_expr());
627+
}
617628

618629
if(code_type.return_type().id()!=ID_empty &&
619630
code_type.return_type().id()!=ID_destructor)
620631
{
621-
side_effect_expr_function_callt expr_call;
622-
expr_call.function()=
623-
symbol_exprt(component.get_name(), component.type());
624632
expr_call.type()=to_code_type(component.type()).return_type();
625-
expr_call.arguments().reserve(args.size());
626-
expr_call.arguments().push_back(late_cast);
627-
628-
for(std::size_t i=1; i < args.size(); i++)
629-
{
630-
expr_call.arguments().push_back(
631-
namespacet(symbol_table).lookup(
632-
args[i].get(ID_C_identifier)).symbol_expr());
633-
}
633+
exprt already_typechecked(ID_already_typechecked);
634+
already_typechecked.move_to_operands(expr_call);
634635

635-
func_symb.value=code_returnt(expr_call);
636+
func_symb.value = code_returnt(already_typechecked).make_block();
636637
}
637638
else
638639
{
639-
code_function_callt code_func;
640-
code_func.function()=
641-
symbol_exprt(component.get_name(), component.type());
642-
code_func.arguments().reserve(args.size());
643-
code_func.arguments().push_back(late_cast);
640+
exprt already_typechecked(ID_already_typechecked);
641+
already_typechecked.move_to_operands(expr_call);
644642

645-
for(std::size_t i=1; i < args.size(); i++)
646-
{
647-
code_func.arguments().push_back(
648-
namespacet(symbol_table).lookup(
649-
args[i].get(ID_C_identifier)).symbol_expr());
650-
}
651-
652-
func_symb.value=code_func;
643+
func_symb.value = code_expressiont(already_typechecked).make_block();
653644
}
654645

655646
// add this new function to the list of components
@@ -665,6 +656,8 @@ void cpp_typecheckt::typecheck_compound_declarator(
665656
CHECK_RETURN(!failed);
666657
}
667658

659+
put_compound_into_scope(new_compo);
660+
668661
// next base
669662
virtual_bases.erase(virtual_bases.begin());
670663
}

src/cpp/cpp_typecheck_function.cpp

+12-1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ void cpp_typecheckt::convert_parameter(
3434

3535
parameter.set_identifier(identifier);
3636

37+
// the parameter may already have been set up if dealing with virtual methods
38+
const symbolt *check_symbol;
39+
if(!lookup(identifier, check_symbol))
40+
return;
41+
3742
symbolt symbol;
3843

3944
symbol.name=identifier;
@@ -93,7 +98,13 @@ void cpp_typecheckt::convert_function(symbolt &symbol)
9398
assert(symbol.value.id()==ID_code);
9499
assert(symbol.value.get(ID_statement)==ID_block);
95100

96-
symbol.value.copy_to_operands(dtor(msymb));
101+
if(
102+
!symbol.value.has_operands() ||
103+
!symbol.value.op0().has_operands() ||
104+
symbol.value.op0().op0().id() != ID_already_typechecked)
105+
{
106+
symbol.value.copy_to_operands(dtor(msymb));
107+
}
97108
}
98109

99110
// enter appropriate scope

0 commit comments

Comments
 (0)