File tree 4 files changed +20
-9
lines changed
unit/solvers/smt2_incremental
4 files changed +20
-9
lines changed Original file line number Diff line number Diff line change @@ -1270,7 +1270,8 @@ void c_typecheck_baset::typecheck_c_enum_type(typet &type)
1270
1270
// we also track min and max to find a nice base type
1271
1271
mp_integer value=0 , min_value=0 , max_value=0 ;
1272
1272
1273
- std::list<c_enum_typet::c_enum_membert> enum_members;
1273
+ std::vector<c_enum_typet::c_enum_membert> enum_members;
1274
+ enum_members.reserve (as_expr.operands ().size ());
1274
1275
1275
1276
// We need to determine a width, and a signedness
1276
1277
// to obtain an 'underlying type'.
@@ -1413,14 +1414,11 @@ void c_typecheck_baset::typecheck_c_enum_type(typet &type)
1413
1414
enum_tag_symbol.is_file_local =true ;
1414
1415
enum_tag_symbol.base_name =base_name;
1415
1416
1416
- // throw in the enum members as 'body'
1417
- irept::subt &body=enum_tag_symbol.type .add (ID_body).get_sub ();
1418
-
1419
- for (const auto &member : enum_members)
1420
- body.push_back (member);
1421
-
1422
1417
enum_tag_symbol.type .add_subtype () = underlying_type;
1423
1418
1419
+ // throw in the enum members as 'body'
1420
+ to_c_enum_type (enum_tag_symbol.type ).members () = std::move (enum_members);
1421
+
1424
1422
// is it in the symbol table already?
1425
1423
symbolt *existing_symbol = symbol_table.get_writeable (identifier);
1426
1424
Original file line number Diff line number Diff line change @@ -274,6 +274,17 @@ class c_enum_typet : public type_with_subtypet
274
274
275
275
typedef std::vector<c_enum_membert> memberst;
276
276
277
+ c_enum_typet (typet _subtype, memberst enum_members)
278
+ : c_enum_typet(std::move(_subtype))
279
+ {
280
+ members () = std::move (enum_members);
281
+ }
282
+
283
+ memberst &members ()
284
+ {
285
+ return reinterpret_cast <memberst &>(add (ID_body).get_sub ());
286
+ }
287
+
277
288
const memberst &members () const
278
289
{
279
290
return (const memberst &)(find (ID_body).get_sub ());
Original file line number Diff line number Diff line change @@ -36,7 +36,8 @@ static type_symbolt make_c_enum_type_symbol(std::size_t underlying_size)
36
36
const signedbv_typet underlying_type{underlying_size};
37
37
c_enum_typet enum_type{underlying_type};
38
38
39
- auto &members = enum_type.add (ID_body).get_sub ();
39
+ auto &members = enum_type.members ();
40
+ members.reserve (20 );
40
41
41
42
for (unsigned int i = 0 ; i < 20 ; ++i)
42
43
{
Original file line number Diff line number Diff line change @@ -15,7 +15,8 @@ static c_enum_typet make_c_enum_type(
15
15
{
16
16
c_enum_typet enum_type{underlying_type};
17
17
18
- auto &members = enum_type.add (ID_body).get_sub ();
18
+ auto &members = enum_type.members ();
19
+ members.reserve (value_count);
19
20
20
21
for (unsigned int i = 0 ; i < value_count; ++i)
21
22
{
You can’t perform that action at this time.
0 commit comments