Skip to content

Commit 7797757

Browse files
author
Daniel Kroening
authored
Merge pull request #2828 from diffblue/cpp-constructor-optional
cpp_typecheckt::cpp_constructor now returns optionalt<codet>
2 parents f7fc6a9 + da6e5d7 commit 7797757

10 files changed

+78
-100
lines changed

src/cpp/cpp_constructor.cpp

Lines changed: 15 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ Author: Daniel Kroening, [email protected]
2222
/// \param object: non-typechecked object
2323
/// \param operands: non-typechecked operands
2424
/// \return typechecked code
25-
codet cpp_typecheckt::cpp_constructor(
25+
optionalt<codet> cpp_typecheckt::cpp_constructor(
2626
const source_locationt &source_location,
2727
const exprt &object,
2828
const exprt::operandst &operands)
@@ -56,22 +56,13 @@ codet cpp_typecheckt::cpp_constructor(
5656
assert(operands.empty() || operands.size()==1);
5757

5858
if(operands.empty() && cpp_is_pod(tmp_type))
59-
{
60-
codet nil;
61-
nil.make_nil();
62-
return nil;
63-
}
59+
return {};
6460

6561
const exprt &size_expr=
6662
to_array_type(tmp_type).size();
6763

6864
if(size_expr.id() == ID_infinity)
69-
{
70-
// don't initialize
71-
codet nil;
72-
nil.make_nil();
73-
return nil;
74-
}
65+
return {}; // don't initialize
7566

7667
exprt tmp_size=size_expr;
7768
make_constant_index(tmp_size);
@@ -122,23 +113,16 @@ codet cpp_typecheckt::cpp_constructor(
122113
tmp_operands.push_back(operand);
123114
}
124115

125-
exprt i_code =
126-
cpp_constructor(source_location, index, tmp_operands);
127-
128-
if(i_code.is_nil())
129-
{
130-
new_code.is_nil();
131-
break;
132-
}
116+
auto i_code = cpp_constructor(source_location, index, tmp_operands);
133117

134-
new_code.move_to_operands(i_code);
118+
if(i_code.has_value())
119+
new_code.move(i_code.value());
135120
}
136121
return new_code;
137122
}
138123
}
139124
else if(cpp_is_pod(tmp_type))
140125
{
141-
code_expressiont new_code;
142126
exprt::operandst operands_tc=operands;
143127

144128
for(exprt::operandst::iterator
@@ -153,7 +137,7 @@ codet cpp_typecheckt::cpp_constructor(
153137
if(operands_tc.empty())
154138
{
155139
// a POD is NOT initialized
156-
new_code.make_nil();
140+
return {};
157141
}
158142
else if(operands_tc.size()==1)
159143
{
@@ -163,7 +147,9 @@ codet cpp_typecheckt::cpp_constructor(
163147
side_effect_exprt assign(ID_assign, typet(), source_location);
164148
assign.copy_to_operands(object_tc, operands_tc.front());
165149
typecheck_side_effect_assignment(assign);
150+
code_expressiont new_code;
166151
new_code.expression()=assign;
152+
return new_code;
167153
}
168154
else
169155
{
@@ -172,8 +158,6 @@ codet cpp_typecheckt::cpp_constructor(
172158
"but got " << operands.size() << eom;
173159
throw 0;
174160
}
175-
176-
return new_code;
177161
}
178162
else if(tmp_type.id()==ID_union)
179163
{
@@ -293,9 +277,7 @@ codet cpp_typecheckt::cpp_constructor(
293277
else
294278
UNREACHABLE;
295279

296-
codet nil;
297-
nil.make_nil();
298-
return nil;
280+
return {};
299281
}
300282

301283
void cpp_typecheckt::new_temporary(
@@ -316,15 +298,14 @@ void cpp_typecheckt::new_temporary(
316298

317299
already_typechecked(new_object);
318300

319-
codet new_code =
320-
cpp_constructor(source_location, new_object, ops);
301+
auto new_code = cpp_constructor(source_location, new_object, ops);
321302

322-
if(new_code.is_not_nil())
303+
if(new_code.has_value())
323304
{
324-
if(new_code.get(ID_statement)==ID_assign)
325-
tmp_object_expr.move_to_operands(new_code.op1());
305+
if(new_code->get_statement() == ID_assign)
306+
tmp_object_expr.move_to_operands(new_code->op1());
326307
else
327-
tmp_object_expr.add(ID_initializer)=new_code;
308+
tmp_object_expr.add(ID_initializer) = *new_code;
328309
}
329310

330311
temporary.swap(tmp_object_expr);

src/cpp/cpp_destructor.cpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ Author: Daniel Kroening, [email protected]
1616
#include <util/c_types.h>
1717

1818
/// \return typechecked code
19-
codet cpp_typecheckt::cpp_destructor(
19+
optionalt<codet> cpp_typecheckt::cpp_destructor(
2020
const source_locationt &source_location,
2121
const exprt &object)
2222
{
@@ -31,22 +31,15 @@ codet cpp_typecheckt::cpp_destructor(
3131

3232
// PODs don't need a destructor
3333
if(cpp_is_pod(tmp_type))
34-
{
35-
new_code.make_nil();
36-
return new_code;
37-
}
34+
return {};
3835

3936
if(tmp_type.id()==ID_array)
4037
{
4138
const exprt &size_expr=
4239
to_array_type(tmp_type).size();
4340

4441
if(size_expr.id()=="infinity")
45-
{
46-
// don't initialize
47-
new_code.make_nil();
48-
return new_code;
49-
}
42+
return {}; // don't initialize
5043

5144
exprt tmp_size=size_expr;
5245
make_constant_index(tmp_size);
@@ -73,9 +66,9 @@ codet cpp_typecheckt::cpp_destructor(
7366
index_exprt index(object, constant);
7467
index.add_source_location()=source_location;
7568

76-
exprt i_code = cpp_destructor(source_location, index);
77-
78-
new_code.move_to_operands(i_code);
69+
auto i_code = cpp_destructor(source_location, index);
70+
if(i_code.has_value())
71+
new_code.move_to_operands(i_code.value());
7972
}
8073
}
8174
else

src/cpp/cpp_typecheck.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,11 +188,10 @@ void cpp_typecheckt::static_and_dynamic_initialization()
188188
// use default constructor
189189
exprt::operandst ops;
190190

191-
codet call=
192-
cpp_constructor(symbol.location, symbol_expr, ops);
191+
auto call = cpp_constructor(symbol.location, symbol_expr, ops);
193192

194-
if(call.is_not_nil())
195-
init_block.move_to_operands(call);
193+
if(call.has_value())
194+
init_block.move(call.value());
196195
}
197196
}
198197

src/cpp/cpp_typecheck.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ class cpp_typecheckt:public c_typecheck_baset
9999

100100
bool cpp_is_pod(const typet &type) const;
101101

102-
codet cpp_constructor(
102+
optionalt<codet> cpp_constructor(
103103
const source_locationt &source_location,
104104
const exprt &object,
105105
const exprt::operandst &operands);
@@ -427,9 +427,8 @@ class cpp_typecheckt:public c_typecheck_baset
427427

428428
const struct_typet &this_struct_type();
429429

430-
codet cpp_destructor(
431-
const source_locationt &source_location,
432-
const exprt &object);
430+
optionalt<codet>
431+
cpp_destructor(const source_locationt &source_location, const exprt &object);
433432

434433
// expressions
435434
void explicit_typecast_ambiguity(exprt &expr);

src/cpp/cpp_typecheck_code.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -327,16 +327,17 @@ void cpp_typecheckt::typecheck_member_initializer(codet &code)
327327
// it's a data member
328328
already_typechecked(symbol_expr);
329329

330-
exprt call=
330+
auto call =
331331
cpp_constructor(code.source_location(), symbol_expr, code.operands());
332332

333-
if(call.is_nil())
333+
if(call.has_value())
334+
code.swap(call.value());
335+
else
334336
{
335-
call=codet(ID_skip);
336-
call.add_source_location()=code.source_location();
337+
auto source_location = code.source_location();
338+
code = codet(ID_skip);
339+
code.add_source_location() = source_location;
337340
}
338-
339-
code.swap(call);
340341
}
341342
}
342343
else
@@ -434,14 +435,11 @@ void cpp_typecheckt::typecheck_decl(codet &code)
434435

435436
already_typechecked(object_expr);
436437

437-
exprt constructor_call=
438-
cpp_constructor(
439-
symbol.location,
440-
object_expr,
441-
declarator.init_args().operands());
438+
auto constructor_call = cpp_constructor(
439+
symbol.location, object_expr, declarator.init_args().operands());
442440

443-
if(constructor_call.is_not_nil())
444-
new_code.move_to_operands(constructor_call);
441+
if(constructor_call.has_value())
442+
new_code.move_to_operands(constructor_call.value());
445443
}
446444
}
447445

src/cpp/cpp_typecheck_compound_type.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -740,10 +740,10 @@ void cpp_typecheckt::typecheck_compound_declarator(
740740

741741
exprt::operandst ops;
742742
ops.push_back(value);
743-
codet defcode =
744-
cpp_constructor(source_locationt(), symexpr, ops);
743+
auto defcode = cpp_constructor(source_locationt(), symexpr, ops);
744+
CHECK_RETURN(defcode.has_value());
745745

746-
new_symbol->value.swap(defcode);
746+
new_symbol->value.swap(defcode.value());
747747
}
748748
}
749749
}

src/cpp/cpp_typecheck_declaration.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,11 +178,15 @@ void cpp_typecheckt::convert_non_template_declaration(
178178
if(symbol.is_lvalue &&
179179
declarator.init_args().has_operands())
180180
{
181-
symbol.value=
182-
cpp_constructor(
183-
symbol.location,
184-
cpp_symbol_expr(symbol),
185-
declarator.init_args().operands());
181+
auto constructor = cpp_constructor(
182+
symbol.location,
183+
cpp_symbol_expr(symbol),
184+
declarator.init_args().operands());
185+
186+
if(constructor.has_value())
187+
symbol.value = constructor.value();
188+
else
189+
symbol.value = nil_exprt();
186190
}
187191
}
188192
}

src/cpp/cpp_typecheck_destructor.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,11 @@ codet cpp_typecheckt::dtor(const symbolt &symbol)
144144

145145
const bool disabled_access_control = disable_access_control;
146146
disable_access_control = true;
147-
codet dtor_code = cpp_destructor(source_location, member);
147+
auto dtor_code = cpp_destructor(source_location, member);
148148
disable_access_control = disabled_access_control;
149149

150-
if(dtor_code.is_not_nil())
151-
block.move_to_operands(dtor_code);
150+
if(dtor_code.has_value())
151+
block.move_to_operands(dtor_code.value());
152152
}
153153

154154
const irept::subt &bases=symbol.type.find(ID_bases).get_sub();
@@ -169,11 +169,11 @@ codet cpp_typecheckt::dtor(const symbolt &symbol)
169169

170170
const bool disabled_access_control = disable_access_control;
171171
disable_access_control = true;
172-
exprt dtor_code = cpp_destructor(source_location, object);
172+
auto dtor_code = cpp_destructor(source_location, object);
173173
disable_access_control = disabled_access_control;
174174

175-
if(dtor_code.is_not_nil())
176-
block.move_to_operands(dtor_code);
175+
if(dtor_code.has_value())
176+
block.move_to_operands(dtor_code.value());
177177
}
178178

179179
return block;

src/cpp/cpp_typecheck_expr.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -852,13 +852,13 @@ void cpp_typecheckt::typecheck_expr_new(exprt &expr)
852852
throw 0;
853853
}
854854

855-
exprt code=
856-
cpp_constructor(
857-
expr.find_source_location(),
858-
object_expr,
859-
initializer.operands());
855+
auto code = cpp_constructor(
856+
expr.find_source_location(), object_expr, initializer.operands());
860857

861-
expr.add(ID_initializer).swap(code);
858+
if(code.has_value())
859+
expr.add(ID_initializer).swap(code.value());
860+
else
861+
expr.add(ID_initializer) = nil_exprt();
862862

863863
// we add the size of the object for convenience of the
864864
// runtime library
@@ -1074,15 +1074,16 @@ void cpp_typecheckt::typecheck_expr_delete(exprt &expr)
10741074

10751075
already_typechecked(new_object);
10761076

1077-
codet destructor_code=cpp_destructor(
1078-
expr.source_location(),
1079-
new_object);
1080-
1081-
// this isn't typechecked yet
1082-
if(destructor_code.is_not_nil())
1083-
typecheck_code(destructor_code);
1077+
auto destructor_code = cpp_destructor(expr.source_location(), new_object);
10841078

1085-
expr.set(ID_destructor, destructor_code);
1079+
if(destructor_code.has_value())
1080+
{
1081+
// this isn't typechecked yet
1082+
typecheck_code(destructor_code.value());
1083+
expr.set(ID_destructor, destructor_code.value());
1084+
}
1085+
else
1086+
expr.set(ID_destructor, nil_exprt());
10861087
}
10871088

10881089
void cpp_typecheckt::typecheck_expr_typecast(exprt &)

src/cpp/cpp_typecheck_initializer.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,13 @@ void cpp_typecheckt::convert_initializer(symbolt &symbol)
180180
exprt::operandst ops;
181181
ops.push_back(symbol.value);
182182

183-
symbol.value = cpp_constructor(
184-
symbol.value.source_location(),
185-
expr_symbol,
186-
ops);
183+
auto constructor =
184+
cpp_constructor(symbol.value.source_location(), expr_symbol, ops);
185+
186+
if(constructor.has_value())
187+
symbol.value = constructor.value();
188+
else
189+
symbol.value = nil_exprt();
187190
}
188191
}
189192

0 commit comments

Comments
 (0)