@@ -516,8 +516,6 @@ void value_sett::get_value_set_rec(
516516 std::cout << " GET_VALUE_SET_REC SUFFIX: " << suffix << ' \n ' ;
517517#endif
518518
519- const typet &expr_type=ns.follow (expr.type ());
520-
521519 if (expr.id ()==ID_unknown || expr.id ()==ID_invalid)
522520 {
523521 insert (dest, exprt (ID_unknown, original_type));
@@ -539,17 +537,18 @@ void value_sett::get_value_set_rec(
539537 }
540538 else if (expr.id ()==ID_member)
541539 {
542- const typet &type = ns. follow ( to_member_expr (expr).compound (). type () );
540+ const exprt &compound = to_member_expr (expr).compound ();
543541
544542 DATA_INVARIANT (
545- type.id () == ID_struct || type.id () == ID_union,
543+ compound.type ().id () == ID_struct_tag ||
544+ compound.type ().id () == ID_union_tag,
546545 " compound of member expression must be struct or union" );
547546
548547 const std::string &component_name=
549548 expr.get_string (ID_component_name);
550549
551550 get_value_set_rec (
552- to_member_expr (expr). compound () ,
551+ compound,
553552 dest,
554553 includes_nondet_pointer,
555554 " ." + component_name + suffix,
@@ -559,7 +558,7 @@ void value_sett::get_value_set_rec(
559558 else if (expr.id ()==ID_symbol)
560559 {
561560 auto entry_index = get_index_of_symbol (
562- to_symbol_expr (expr).get_identifier (), expr_type , suffix, ns);
561+ to_symbol_expr (expr).get_identifier (), expr. type () , suffix, ns);
563562
564563 if (entry_index.has_value ())
565564 make_union (dest, find_entry (*entry_index)->object_map );
@@ -624,11 +623,11 @@ void value_sett::get_value_set_rec(
624623 {
625624 insert (
626625 dest,
627- exprt (ID_null_object, to_pointer_type (expr_type ).base_type ()),
626+ exprt (ID_null_object, to_pointer_type (expr. type () ).base_type ()),
628627 mp_integer{0 });
629628 }
630- else if (expr_type. id ()==ID_unsignedbv ||
631- expr_type. id ()== ID_signedbv)
629+ else if (
630+ expr. type (). id () == ID_unsignedbv || expr. type (). id () == ID_signedbv)
632631 {
633632 // an integer constant got turned into a pointer
634633 insert (dest, exprt (ID_integer_address, unsigned_char_type ()));
@@ -703,7 +702,7 @@ void value_sett::get_value_set_rec(
703702 // special case for plus/minus and exactly one pointer
704703 std::optional<exprt> ptr_operand;
705704 if (
706- expr_type .id () == ID_pointer &&
705+ expr. type () .id () == ID_pointer &&
707706 (expr.id () == ID_plus || expr.id () == ID_minus))
708707 {
709708 bool non_const_offset = false ;
@@ -879,10 +878,10 @@ void value_sett::get_value_set_rec(
879878 statement==ID_cpp_new_array)
880879 {
881880 PRECONDITION (suffix.empty ());
882- PRECONDITION (expr_type .id () == ID_pointer);
881+ PRECONDITION (expr. type () .id () == ID_pointer);
883882
884883 dynamic_object_exprt dynamic_object (
885- to_pointer_type (expr_type ).base_type ());
884+ to_pointer_type (expr. type () ).base_type ());
886885 dynamic_object.set_instance (location_number);
887886 dynamic_object.valid ()=true_exprt ();
888887
@@ -893,7 +892,8 @@ void value_sett::get_value_set_rec(
893892 }
894893 else if (expr.id ()==ID_struct)
895894 {
896- const auto &struct_components = to_struct_type (expr_type).components ();
895+ const auto &struct_components =
896+ ns.follow_tag (to_struct_tag_type (expr.type ())).components ();
897897 INVARIANT (
898898 struct_components.size () == expr.operands ().size (),
899899 " struct expression should have an operand per component" );
@@ -950,7 +950,7 @@ void value_sett::get_value_set_rec(
950950
951951 // If the suffix is empty we're looking for the whole struct:
952952 // default to combining both options as below.
953- if (expr_type. id () == ID_struct && !suffix.empty ())
953+ if (expr. type (). id () == ID_struct_tag && !suffix.empty ())
954954 {
955955 irep_idt component_name = with_expr.where ().get (ID_component_name);
956956 if (suffix_starts_with_field (suffix, id2string (component_name)))
@@ -966,7 +966,8 @@ void value_sett::get_value_set_rec(
966966 original_type,
967967 ns);
968968 }
969- else if (to_struct_type (expr_type).has_component (component_name))
969+ else if (ns.follow_tag (to_struct_tag_type (expr.type ()))
970+ .has_component (component_name))
970971 {
971972 // Looking for a non-overwritten member, look through this expression
972973 get_value_set_rec (
@@ -998,7 +999,7 @@ void value_sett::get_value_set_rec(
998999 ns);
9991000 }
10001001 }
1001- else if (expr_type .id () == ID_array && !suffix.empty ())
1002+ else if (expr. type () .id () == ID_array && !suffix.empty ())
10021003 {
10031004 std::string new_value_suffix;
10041005 if (has_prefix (suffix, " []" ))
@@ -1105,8 +1106,7 @@ void value_sett::get_value_set_rec(
11051106
11061107 bool found=false ;
11071108
1108- const typet &op_type = ns.follow (byte_extract_expr.op ().type ());
1109- if (op_type.id () == ID_struct)
1109+ if (byte_extract_expr.op ().type ().id () == ID_struct_tag)
11101110 {
11111111 exprt offset = byte_extract_expr.offset ();
11121112 if (eval_pointer_offset (offset, ns))
@@ -1115,7 +1115,8 @@ void value_sett::get_value_set_rec(
11151115 const auto offset_int = numeric_cast<mp_integer>(offset);
11161116 const auto type_size = pointer_offset_size (expr.type (), ns);
11171117
1118- const struct_typet &struct_type = to_struct_type (op_type);
1118+ const struct_typet &struct_type =
1119+ ns.follow_tag (to_struct_tag_type (byte_extract_expr.op ().type ()));
11191120
11201121 for (const auto &c : struct_type.components ())
11211122 {
@@ -1150,10 +1151,13 @@ void value_sett::get_value_set_rec(
11501151 }
11511152 }
11521153
1153- if (op_type. id () == ID_union )
1154+ if (byte_extract_expr. op (). type (). id () == ID_union_tag )
11541155 {
11551156 // just collect them all
1156- for (const auto &c : to_union_type (op_type).components ())
1157+ const auto &components =
1158+ ns.follow_tag (to_union_tag_type (byte_extract_expr.op ().type ()))
1159+ .components ();
1160+ for (const auto &c : components)
11571161 {
11581162 const irep_idt &name = c.get_name ();
11591163 member_exprt member (byte_extract_expr.op (), name, c.type ());
@@ -1429,13 +1433,12 @@ void value_sett::get_reference_set_rec(
14291433 // We cannot introduce a cast from scalar to non-scalar,
14301434 // thus, we can only adjust the types of structs and unions.
14311435
1432- const typet &final_object_type = ns.follow (object.type ());
1433-
1434- if (final_object_type.id ()==ID_struct ||
1435- final_object_type.id ()==ID_union)
1436+ if (
1437+ object.type ().id () == ID_struct_tag ||
1438+ object.type ().id () == ID_union_tag)
14361439 {
14371440 // adjust type?
1438- if (ns. follow ( struct_op.type ())!=final_object_type )
1441+ if (struct_op.type () != object. type () )
14391442 {
14401443 member_expr.compound () =
14411444 typecast_exprt (member_expr.compound (), struct_op.type ());
@@ -1478,11 +1481,10 @@ void value_sett::assign(
14781481 output (std::cout);
14791482#endif
14801483
1481- const typet &type=ns.follow (lhs.type ());
1482-
1483- if (type.id () == ID_struct)
1484+ if (lhs.type ().id () == ID_struct_tag)
14841485 {
1485- for (const auto &c : to_struct_type (type).components ())
1486+ for (const auto &c :
1487+ ns.follow_tag (to_struct_tag_type (lhs.type ())).components ())
14861488 {
14871489 const typet &subtype = c.type ();
14881490 const irep_idt &name = c.get_name ();
@@ -1513,12 +1515,14 @@ void value_sett::assign(
15131515 " rhs.type():\n " +
15141516 rhs.type ().pretty () + " \n " + " lhs.type():\n " + lhs.type ().pretty ());
15151517
1516- const typet &followed = ns.follow (rhs.type ());
1517-
1518- if (followed.id () == ID_struct || followed.id () == ID_union)
1518+ if (rhs.type ().id () == ID_struct_tag || rhs.type ().id () == ID_union_tag)
15191519 {
15201520 const struct_union_typet &rhs_struct_union_type =
1521- to_struct_union_type (followed);
1521+ rhs.type ().id () == ID_struct_tag
1522+ ? static_cast <const struct_union_typet &>(
1523+ ns.follow_tag (to_struct_tag_type (rhs.type ())))
1524+ : static_cast <const struct_union_typet &>(
1525+ ns.follow_tag (to_union_tag_type (rhs.type ())));
15221526
15231527 const typet &rhs_subtype = rhs_struct_union_type.component_type (name);
15241528 rhs_member = simplify_expr (member_exprt{rhs, name, rhs_subtype}, ns);
@@ -1528,30 +1532,30 @@ void value_sett::assign(
15281532 }
15291533 }
15301534 }
1531- else if (type.id ()== ID_array)
1535+ else if (lhs. type () .id () == ID_array)
15321536 {
15331537 const index_exprt lhs_index (
15341538 lhs,
15351539 exprt (ID_unknown, c_index_type ()),
1536- to_array_type (type).element_type ());
1540+ to_array_type (lhs. type () ).element_type ());
15371541
15381542 if (rhs.id ()==ID_unknown ||
15391543 rhs.id ()==ID_invalid)
15401544 {
15411545 assign (
15421546 lhs_index,
1543- exprt (rhs.id (), to_array_type (type).element_type ()),
1547+ exprt (rhs.id (), to_array_type (lhs. type () ).element_type ()),
15441548 ns,
15451549 is_simplified,
15461550 add_to_sets);
15471551 }
15481552 else
15491553 {
15501554 DATA_INVARIANT (
1551- rhs.type () == type,
1555+ rhs.type () == lhs. type () ,
15521556 " value_sett::assign types should match, got: "
15531557 " rhs.type():\n " +
1554- rhs.type ().pretty () + " \n " + " type:\n " + type.pretty ());
1558+ rhs.type ().pretty () + " \n " + " type:\n " + lhs. type () .pretty ());
15551559
15561560 if (rhs.id ()==ID_array_of)
15571561 {
@@ -1575,7 +1579,7 @@ void value_sett::assign(
15751579 const index_exprt op0_index (
15761580 to_with_expr (rhs).old (),
15771581 exprt (ID_unknown, c_index_type ()),
1578- to_array_type (type).element_type ());
1582+ to_array_type (lhs. type () ).element_type ());
15791583
15801584 assign (lhs_index, op0_index, ns, is_simplified, add_to_sets);
15811585 assign (
@@ -1586,7 +1590,7 @@ void value_sett::assign(
15861590 const index_exprt rhs_index (
15871591 rhs,
15881592 exprt (ID_unknown, c_index_type ()),
1589- to_array_type (type).element_type ());
1593+ to_array_type (lhs. type () ).element_type ());
15901594 assign (lhs_index, rhs_index, ns, is_simplified, true );
15911595 }
15921596 }
@@ -1683,15 +1687,15 @@ void value_sett::assign_rec(
16831687 {
16841688 const auto &lhs_member_expr = to_member_expr (lhs);
16851689 const auto &component_name = lhs_member_expr.get_component_name ();
1686-
1687- const typet &type = ns.follow (lhs_member_expr.compound ().type ());
1690+ const exprt &compound = lhs_member_expr.compound ();
16881691
16891692 DATA_INVARIANT (
1690- type.id () == ID_struct || type.id () == ID_union,
1693+ compound.type ().id () == ID_struct_tag ||
1694+ compound.type ().id () == ID_union_tag,
16911695 " operand 0 of member expression must be struct or union" );
16921696
16931697 assign_rec (
1694- lhs_member_expr. compound () ,
1698+ compound,
16951699 values_rhs,
16961700 " ." + id2string (component_name) + suffix,
16971701 ns,
0 commit comments