Skip to content

Commit 416687c

Browse files
author
Daniel Kroening
committed
use optionalt<exprt> instead of nil_exprt in expr_initializer
This matches the signature of the external interface.
1 parent 55302b7 commit 416687c

File tree

1 file changed

+65
-60
lines changed

1 file changed

+65
-60
lines changed

src/util/expr_initializer.cpp

Lines changed: 65 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,22 @@ class expr_initializert
2626
{
2727
}
2828

29-
exprt operator()(
30-
const typet &type,
31-
const source_locationt &source_location)
29+
optionalt<exprt>
30+
operator()(const typet &type, const source_locationt &source_location)
3231
{
3332
return expr_initializer_rec(type, source_location);
3433
}
3534

3635
protected:
3736
const namespacet &ns;
3837

39-
exprt expr_initializer_rec(
38+
optionalt<exprt> expr_initializer_rec(
4039
const typet &type,
4140
const source_locationt &source_location);
4241
};
4342

4443
template <bool nondet>
45-
exprt expr_initializert<nondet>::expr_initializer_rec(
44+
optionalt<exprt> expr_initializert<nondet>::expr_initializer_rec(
4645
const typet &type,
4746
const source_locationt &source_location)
4847
{
@@ -103,12 +102,12 @@ exprt expr_initializert<nondet>::expr_initializer_rec(
103102
result = side_effect_expr_nondett(type, source_location);
104103
else
105104
{
106-
exprt sub_zero =
105+
auto sub_zero =
107106
expr_initializer_rec(to_complex_type(type).subtype(), source_location);
108-
if(sub_zero.is_nil())
109-
return nil_exprt();
107+
if(!sub_zero.has_value())
108+
return {};
110109

111-
result = complex_exprt(sub_zero, sub_zero, to_complex_type(type));
110+
result = complex_exprt(*sub_zero, *sub_zero, to_complex_type(type));
112111
}
113112

114113
result.add_source_location()=source_location;
@@ -130,17 +129,16 @@ exprt expr_initializert<nondet>::expr_initializer_rec(
130129
}
131130
else
132131
{
133-
exprt tmpval =
134-
expr_initializer_rec(array_type.subtype(), source_location);
135-
if(tmpval.is_nil())
136-
return nil_exprt();
132+
auto tmpval = expr_initializer_rec(array_type.subtype(), source_location);
133+
if(!tmpval.has_value())
134+
return {};
137135

138136
if(array_type.size().id()==ID_infinity)
139137
{
140138
if(nondet)
141139
return side_effect_expr_nondett(type, source_location);
142140

143-
array_of_exprt value(tmpval, array_type);
141+
array_of_exprt value(*tmpval, array_type);
144142
value.add_source_location()=source_location;
145143
return std::move(value);
146144
}
@@ -151,14 +149,15 @@ exprt expr_initializert<nondet>::expr_initializer_rec(
151149
if(nondet)
152150
return side_effect_expr_nondett(type, source_location);
153151
else
154-
return nil_exprt();
152+
return {};
155153
}
156154

157155
if(*array_size < 0)
158-
return nil_exprt();
156+
return {};
159157

160158
array_exprt value({}, array_type);
161-
value.operands().resize(numeric_cast_v<std::size_t>(*array_size), tmpval);
159+
value.operands().resize(
160+
numeric_cast_v<std::size_t>(*array_size), *tmpval);
162161
value.add_source_location()=source_location;
163162
return std::move(value);
164163
}
@@ -167,18 +166,18 @@ exprt expr_initializert<nondet>::expr_initializer_rec(
167166
{
168167
const vector_typet &vector_type=to_vector_type(type);
169168

170-
exprt tmpval = expr_initializer_rec(vector_type.subtype(), source_location);
171-
if(tmpval.is_nil())
172-
return nil_exprt();
169+
auto tmpval = expr_initializer_rec(vector_type.subtype(), source_location);
170+
if(!tmpval.has_value())
171+
return {};
173172

174173
const mp_integer vector_size =
175174
numeric_cast_v<mp_integer>(vector_type.size());
176175

177176
if(vector_size < 0)
178-
return nil_exprt();
177+
return {};
179178

180179
vector_exprt value({}, vector_type);
181-
value.operands().resize(numeric_cast_v<std::size_t>(vector_size), tmpval);
180+
value.operands().resize(numeric_cast_v<std::size_t>(vector_size), *tmpval);
182181
value.add_source_location()=source_location;
183182

184183
return std::move(value);
@@ -202,11 +201,11 @@ exprt expr_initializert<nondet>::expr_initializer_rec(
202201
}
203202
else
204203
{
205-
const exprt member = expr_initializer_rec(c.type(), source_location);
206-
if(member.is_nil())
207-
return nil_exprt();
204+
const auto member = expr_initializer_rec(c.type(), source_location);
205+
if(!member.has_value())
206+
return {};
208207

209-
value.add_to_operands(std::move(member));
208+
value.add_to_operands(std::move(*member));
210209
}
211210
}
212211

@@ -241,62 +240,78 @@ exprt expr_initializert<nondet>::expr_initializer_rec(
241240
}
242241
}
243242

244-
union_exprt value("", nil_exprt(), type);
245-
value.add_source_location()=source_location;
246-
247243
if(!found)
248244
{
249245
// stupid empty union
246+
union_exprt value("", nil_exprt(), type);
247+
value.add_source_location() = source_location;
248+
return std::move(value);
250249
}
251250
else
252251
{
253-
value.set_component_name(component.get_name());
254-
value.op()=
252+
auto component_value =
255253
expr_initializer_rec(component.type(), source_location);
256-
if(value.op().is_nil())
257-
return nil_exprt();
258-
}
259254

260-
return std::move(value);
255+
if(!component_value.has_value())
256+
return {};
257+
258+
union_exprt value(component.get_name(), *component_value, type);
259+
value.add_source_location() = source_location;
260+
261+
return std::move(value);
262+
}
261263
}
262264
else if(type_id == ID_symbol_type)
263265
{
264-
exprt result = expr_initializer_rec(ns.follow(type), source_location);
266+
auto result = expr_initializer_rec(ns.follow(type), source_location);
267+
268+
if(!result.has_value())
269+
return {};
270+
265271
// we might have mangled the type for arrays, so keep that
266272
if(type.id() != ID_array)
267-
result.type()=type;
273+
result->type() = type;
268274

269-
return result;
275+
return *result;
270276
}
271277
else if(type_id==ID_c_enum_tag)
272278
{
273-
exprt result = expr_initializer_rec(
279+
auto result = expr_initializer_rec(
274280
ns.follow_tag(to_c_enum_tag_type(type)), source_location);
275281

282+
if(!result.has_value())
283+
return {};
284+
276285
// use the tag type
277-
result.type() = type;
286+
result->type() = type;
278287

279-
return result;
288+
return *result;
280289
}
281290
else if(type_id==ID_struct_tag)
282291
{
283-
exprt result = expr_initializer_rec(
292+
auto result = expr_initializer_rec(
284293
ns.follow_tag(to_struct_tag_type(type)), source_location);
285294

295+
if(!result.has_value())
296+
return {};
297+
286298
// use the tag type
287-
result.type() = type;
299+
result->type() = type;
288300

289-
return result;
301+
return *result;
290302
}
291303
else if(type_id==ID_union_tag)
292304
{
293-
exprt result = expr_initializer_rec(
305+
auto result = expr_initializer_rec(
294306
ns.follow_tag(to_union_tag_type(type)), source_location);
295307

308+
if(!result.has_value())
309+
return {};
310+
296311
// use the tag type
297-
result.type() = type;
312+
result->type() = type;
298313

299-
return result;
314+
return *result;
300315
}
301316
else if(type_id==ID_string)
302317
{
@@ -310,7 +325,7 @@ exprt expr_initializert<nondet>::expr_initializer_rec(
310325
return result;
311326
}
312327
else
313-
return nil_exprt();
328+
return {};
314329
}
315330

316331
/// Create the equivalent of zero for type `type`.
@@ -324,12 +339,7 @@ optionalt<exprt> zero_initializer(
324339
const source_locationt &source_location,
325340
const namespacet &ns)
326341
{
327-
expr_initializert<false> z_i(ns);
328-
const exprt result = z_i(type, source_location);
329-
if(result.is_nil())
330-
return {};
331-
else
332-
return result;
342+
return expr_initializert<false>(ns)(type, source_location);
333343
}
334344

335345
/// Create a non-deterministic value for type `type`, with all subtypes
@@ -344,10 +354,5 @@ optionalt<exprt> nondet_initializer(
344354
const source_locationt &source_location,
345355
const namespacet &ns)
346356
{
347-
expr_initializert<true> z_i(ns);
348-
const exprt result = z_i(type, source_location);
349-
if(result.is_nil())
350-
return {};
351-
else
352-
return result;
357+
return expr_initializert<true>(ns)(type, source_location);
353358
}

0 commit comments

Comments
 (0)