Skip to content

Commit 304b41f

Browse files
author
Daniel Kroening
committed
codet now inherits from irept
1 parent 2295232 commit 304b41f

18 files changed

+416
-498
lines changed

src/ansi-c/c_typecheck_code.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ void c_typecheck_baset::typecheck_code(codet &code)
3232
throw 0;
3333
}
3434

35-
code.type() = empty_typet();
36-
3735
const irep_idt &statement=code.get_statement();
3836

3937
if(statement==ID_expression)

src/ansi-c/c_typecheck_expr.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -780,7 +780,7 @@ void c_typecheck_baset::typecheck_expr_operands(exprt &expr)
780780
code_declt decl(symbol.symbol_expr());
781781
decl.add_source_location()=declaration.source_location();
782782

783-
expr.op0()=decl;
783+
expr.get_sub()[0] = decl;
784784

785785
typecheck_expr(expr.op1());
786786
}
@@ -1000,7 +1000,7 @@ void c_typecheck_baset::typecheck_expr_sizeof(exprt &expr)
10001000
ID_statement_expression, void_type(), expr.source_location());
10011001
auto decl_block=code_blockt::from_list(clean_code);
10021002
decl_block.set_statement(ID_decl_block);
1003-
side_effect_expr.copy_to_operands(decl_block);
1003+
side_effect_expr.get_sub().push_back(decl_block);
10041004
clean_code.clear();
10051005

10061006
// We merge the side-effect into the operand of the typecast,
@@ -1057,7 +1057,7 @@ void c_typecheck_baset::typecheck_expr_typecast(exprt &expr)
10571057
ID_statement_expression, void_type(), expr.source_location());
10581058
auto decl_block=code_blockt::from_list(clean_code);
10591059
decl_block.set_statement(ID_decl_block);
1060-
side_effect_expr.copy_to_operands(decl_block);
1060+
side_effect_expr.get_sub().push_back(decl_block);
10611061
clean_code.clear();
10621062

10631063
// We merge the side-effect into the operand of the typecast,

src/cpp/cpp_destructor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ optionalt<codet> cpp_typecheckt::cpp_destructor(
6464

6565
auto i_code = cpp_destructor(source_location, index);
6666
if(i_code.has_value())
67-
new_code.add_to_operands(std::move(i_code.value()));
67+
new_code.add(std::move(i_code.value()));
6868
}
6969

7070
return std::move(new_code);

src/cpp/cpp_typecheck_code.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,10 @@ void cpp_typecheckt::typecheck_code(codet &code)
2626

2727
if(statement==ID_try_catch)
2828
{
29-
code.type() = empty_typet();
3029
typecheck_try_catch(code);
3130
}
3231
else if(statement==ID_member_initializer)
3332
{
34-
code.type() = empty_typet();
3533
typecheck_member_initializer(code);
3634
}
3735
else if(statement==ID_msc_if_exists ||

src/cpp/cpp_typecheck_compound_type.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -671,14 +671,16 @@ void cpp_typecheckt::typecheck_compound_declarator(
671671
exprt already_typechecked(ID_already_typechecked);
672672
already_typechecked.add_to_operands(std::move(expr_call));
673673

674-
func_symb.value = code_returnt(already_typechecked).make_block();
674+
func_symb.value =
675+
code_returnt(already_typechecked).make_block().as_expr();
675676
}
676677
else
677678
{
678679
exprt already_typechecked(ID_already_typechecked);
679680
already_typechecked.add_to_operands(std::move(expr_call));
680681

681-
func_symb.value = code_expressiont(already_typechecked).make_block();
682+
func_symb.value =
683+
code_expressiont(already_typechecked).make_block().as_expr();
682684
}
683685

684686
// add this new function to the list of components

src/cpp/cpp_typecheck_constructor.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ static void copy_parent(
4747
code_assignt code(dereference_exprt(op0), op1);
4848
code.add_source_location() = source_location;
4949

50-
block.operands().push_back(code);
50+
block.operands().push_back(code.as_expr());
5151
}
5252

5353
/// Generate code to copy the member.
@@ -76,7 +76,7 @@ static void copy_member(
7676
code_expressiont code(assign);
7777
code.add_source_location() = source_location;
7878

79-
block.operands().push_back(code);
79+
block.operands().push_back(code.as_expr());
8080
}
8181

8282
/// Generate code to copy the member.
@@ -113,7 +113,7 @@ static void copy_array(
113113
code_expressiont code(assign);
114114
code.add_source_location() = source_location;
115115

116-
block.operands().push_back(code);
116+
block.operands().push_back(code.as_expr());
117117
}
118118

119119
/// Generate code for implicit default constructors
@@ -580,6 +580,7 @@ void cpp_typecheckt::full_member_initialization(
580580

581581
code_ifthenelset cond(
582582
cpp_namet("@most_derived").as_expr(), std::move(block));
583+
583584
final_initializers.move_to_sub(cond);
584585
}
585586

src/cpp/cpp_typecheck_declaration.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ void cpp_typecheckt::convert_non_template_declaration(
172172
declarator.init_args().operands());
173173

174174
if(constructor.has_value())
175-
symbol.value = constructor.value();
175+
symbol.value = constructor.value().as_expr();
176176
else
177177
symbol.value = nil_exprt();
178178
}

src/cpp/cpp_typecheck_function.cpp

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ void cpp_typecheckt::convert_parameter(
3131
parameter.set_base_name(base_name);
3232
}
3333

34-
PRECONDITION(!cpp_scopes.current_scope().prefix.empty());
3534
irep_idt identifier=cpp_scopes.current_scope().prefix+
3635
id2string(base_name);
3736

@@ -42,15 +41,17 @@ void cpp_typecheckt::convert_parameter(
4241
if(!lookup(identifier, check_symbol))
4342
return;
4443

45-
parameter_symbolt symbol;
44+
symbolt symbol;
4645

4746
symbol.name=identifier;
4847
symbol.base_name=parameter.get_base_name();
4948
symbol.location=parameter.source_location();
5049
symbol.mode = current_mode;
5150
symbol.module=module;
5251
symbol.type=parameter.type();
52+
symbol.is_state_var=true;
5353
symbol.is_lvalue=!is_reference(symbol.type);
54+
symbol.is_parameter=true;
5455

5556
INVARIANT(!symbol.base_name.empty(), "parameter has base name");
5657

@@ -91,6 +92,22 @@ void cpp_typecheckt::convert_function(symbolt &symbol)
9192
if(symbol.value.is_nil())
9293
return;
9394

95+
// if it is a destructor, add the implicit code
96+
if(to_code_type(symbol.type).return_type().id() == ID_destructor)
97+
{
98+
const symbolt &msymb=lookup(symbol.type.get(ID_C_member_name));
99+
100+
assert(symbol.value.id()==ID_code);
101+
assert(symbol.value.get(ID_statement)==ID_block);
102+
103+
if(
104+
!symbol.value.has_operands() || !symbol.value.op0().has_operands() ||
105+
symbol.value.op0().op0().id() != ID_already_typechecked)
106+
{
107+
symbol.value.copy_to_operands(dtor(msymb).as_expr());
108+
}
109+
}
110+
94111
// enter appropriate scope
95112
cpp_save_scopet saved_scope(cpp_scopes);
96113
cpp_scopet &function_scope=cpp_scopes.set_scope(symbol.name);
@@ -108,29 +125,13 @@ void cpp_typecheckt::convert_function(symbolt &symbol)
108125
code_typet::parameterst &parameters=function_type.parameters();
109126
assert(parameters.size()>=1);
110127
code_typet::parametert &this_parameter_expr=parameters.front();
111-
function_scope.this_expr = symbol_exprt{
112-
this_parameter_expr.get_identifier(), this_parameter_expr.type()};
128+
function_scope.this_expr=exprt(ID_symbol, this_parameter_expr.type());
129+
function_scope.this_expr.set(
130+
ID_identifier, this_parameter_expr.get_identifier());
113131
}
114132
else
115133
function_scope.this_expr.make_nil();
116134

117-
// if it is a destructor, add the implicit code
118-
if(to_code_type(symbol.type).return_type().id() == ID_destructor)
119-
{
120-
const symbolt &msymb = lookup(symbol.type.get(ID_C_member_name));
121-
122-
PRECONDITION(symbol.value.id() == ID_code);
123-
PRECONDITION(symbol.value.get(ID_statement) == ID_block);
124-
125-
if(
126-
!symbol.value.has_operands() || !symbol.value.op0().has_operands() ||
127-
symbol.value.op0().op0().id() != ID_already_typechecked)
128-
{
129-
symbol.value.copy_to_operands(
130-
dtor(msymb, to_symbol_expr(function_scope.this_expr)));
131-
}
132-
}
133-
134135
// do the function body
135136
start_typecheck_code();
136137

@@ -148,8 +149,6 @@ void cpp_typecheckt::convert_function(symbolt &symbol)
148149
symbol.value.type()=symbol.type;
149150

150151
return_type = old_return_type;
151-
152-
deferred_typechecking.erase(symbol.name);
153152
}
154153

155154
/// for function overloading
@@ -174,7 +173,8 @@ irep_idt cpp_typecheckt::function_identifier(const typet &type)
174173
code_typet::parameterst::const_iterator it=
175174
parameters.begin();
176175

177-
if(it != parameters.end() && it->get_this())
176+
if(it!=parameters.end() &&
177+
it->get_identifier()==ID_this)
178178
{
179179
const typet &pointer=it->type();
180180
const typet &symbol =pointer.subtype();

src/cpp/cpp_typecheck_initializer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ void cpp_typecheckt::convert_initializer(symbolt &symbol)
180180
cpp_constructor(symbol.value.source_location(), expr_symbol, ops);
181181

182182
if(constructor.has_value())
183-
symbol.value = constructor.value();
183+
symbol.value = constructor.value().as_expr();
184184
else
185185
symbol.value = nil_exprt();
186186
}
@@ -309,7 +309,7 @@ void cpp_typecheckt::zero_initializer(
309309
already_typechecked(assign.lhs());
310310

311311
typecheck_code(assign);
312-
ops.push_back(assign);
312+
ops.push_back(assign.as_expr());
313313
}
314314
else
315315
{
@@ -330,6 +330,6 @@ void cpp_typecheckt::zero_initializer(
330330
already_typechecked(assign.lhs());
331331

332332
typecheck_code(assign);
333-
ops.push_back(assign);
333+
ops.push_back(assign.as_expr());
334334
}
335335
}

src/cpp/expr2cpp.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -461,15 +461,15 @@ std::string expr2cppt::convert_code(
461461
const codet &src,
462462
unsigned indent)
463463
{
464-
const irep_idt &statement=src.get(ID_statement);
464+
const irep_idt &statement = src.get_statement();
465465

466466
if(statement==ID_cpp_delete ||
467467
statement==ID_cpp_delete_array)
468-
return convert_code_cpp_delete(src, indent);
468+
return convert_code_cpp_delete(src.as_expr(), indent);
469469

470470
if(statement==ID_cpp_new ||
471471
statement==ID_cpp_new_array)
472-
return convert_code_cpp_new(src, indent);
472+
return convert_cpp_new(src.as_expr(), indent);
473473

474474
return expr2ct::convert_code(src, indent);
475475
}

src/cpp/parse.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,7 +2711,7 @@ bool Parser::rConstructorDecl(
27112711
{
27122712
case TOK_INTEGER:
27132713
{
2714-
constructor.value()=codet("cpp-pure-virtual");
2714+
constructor.value() = exprt("cpp-pure-virtual");
27152715
set_location(constructor.value(), value);
27162716
}
27172717
break;
@@ -2724,7 +2724,7 @@ bool Parser::rConstructorDecl(
27242724
return false;
27252725
}
27262726

2727-
constructor.value()=codet(ID_default);
2727+
constructor.value() = exprt(ID_default);
27282728
set_location(constructor.value(), value);
27292729
}
27302730
break;
@@ -2737,7 +2737,7 @@ bool Parser::rConstructorDecl(
27372737
return false;
27382738
}
27392739

2740-
constructor.value()=codet(ID_cpp_delete);
2740+
constructor.value() = exprt(ID_cpp_delete);
27412741
set_location(constructor.value(), value);
27422742
}
27432743
break;
@@ -2902,7 +2902,7 @@ bool Parser::rDeclaratorWithInit(
29022902
}
29032903

29042904
lex.get_token(tk);
2905-
declarator.value()=codet(ID_default);
2905+
declarator.value() = exprt(ID_default);
29062906
set_location(declarator.value(), tk);
29072907
}
29082908
else if(lex.LookAhead(0)==TOK_DELETE) // C++0x
@@ -2914,7 +2914,7 @@ bool Parser::rDeclaratorWithInit(
29142914
}
29152915

29162916
lex.get_token(tk);
2917-
declarator.value()=codet(ID_cpp_delete);
2917+
declarator.value() = exprt(ID_cpp_delete);
29182918
set_location(declarator.value(), tk);
29192919
}
29202920
else
@@ -3412,7 +3412,7 @@ bool Parser::rMemberInit(exprt &init)
34123412
std::cout << std::string(__indent, ' ') << "Parser::rMemberInit 2\n";
34133413
#endif
34143414

3415-
init=codet(ID_member_initializer);
3415+
init = exprt(ID_member_initializer);
34163416
init.add(ID_member).swap(name);
34173417

34183418
cpp_tokent tk1, tk2;
@@ -7184,7 +7184,7 @@ bool Parser::rFunctionBody(cpp_declaratort &declarator)
71847184
if(lex.get_token(cb)!='}')
71857185
return false;
71867186

7187-
declarator.value()=body;
7187+
declarator.value() = body.as_expr();
71887188
return true;
71897189
}
71907190
else

0 commit comments

Comments
 (0)