Skip to content

Commit 77aa274

Browse files
authored
Merge pull request #6878 from diffblue/typet_subtype_const3
remove uses of typet::subtype() const
2 parents ed19cf1 + 84f0644 commit 77aa274

12 files changed

+101
-62
lines changed

jbmc/src/java_bytecode/assignments_from_json.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,8 @@ static code_with_references_listt assign_array_data_component_from_json(
397397
{
398398
const auto &java_class_type = followed_class_type(expr, info.symbol_table);
399399
const auto &data_component = java_class_type.components()[2];
400-
const auto &element_type =
401-
java_array_element_type(to_struct_tag_type(expr.type().subtype()));
400+
const auto &element_type = java_array_element_type(
401+
to_struct_tag_type(to_pointer_type(expr.type()).base_type()));
402402
const exprt data_member_expr = typecast_exprt::conditional_cast(
403403
member_exprt{dereference_exprt{expr}, "data", data_component.type()},
404404
pointer_type(element_type));
@@ -461,8 +461,8 @@ assign_det_length_array_from_json(
461461
object_creation_infot &info)
462462
{
463463
PRECONDITION(is_java_array_type(expr.type()));
464-
const auto &element_type =
465-
java_array_element_type(to_struct_tag_type(expr.type().subtype()));
464+
const auto &element_type = java_array_element_type(
465+
to_struct_tag_type(to_java_reference_type(expr.type()).base_type()));
466466
const json_arrayt json_array = get_untyped_array(json, element_type);
467467
const auto number_of_elements =
468468
from_integer(json_array.size(), java_int_type());
@@ -490,8 +490,8 @@ static code_with_references_listt assign_nondet_length_array_from_json(
490490
object_creation_infot &info)
491491
{
492492
PRECONDITION(is_java_array_type(array.type()));
493-
const auto &element_type =
494-
java_array_element_type(to_struct_tag_type(array.type().subtype()));
493+
const auto &element_type = java_array_element_type(
494+
to_struct_tag_type(to_java_reference_type(array.type()).base_type()));
495495
const json_arrayt json_array = get_untyped_array(json, element_type);
496496
code_with_references_listt result;
497497
exprt number_of_elements = from_integer(json_array.size(), java_int_type());
@@ -884,8 +884,8 @@ code_with_references_listt assign_from_json_rec(
884884
else
885885
{
886886
PRECONDITION(is_java_array_type(expr.type()));
887-
const auto &element_type =
888-
java_array_element_type(to_struct_tag_type(expr.type().subtype()));
887+
const auto &element_type = java_array_element_type(
888+
to_struct_tag_type(to_java_reference_type(expr.type()).base_type()));
889889
const std::size_t length = get_untyped_array(json, element_type).size();
890890
result.add(allocate_array(
891891
expr, from_integer(length, java_int_type()), info.loc));

jbmc/src/java_bytecode/java_types.cpp

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,12 @@ bool is_java_array_type(const typet &type)
164164
{
165165
if(
166166
!can_cast_type<pointer_typet>(type) ||
167-
!can_cast_type<struct_tag_typet>(type.subtype()))
167+
!can_cast_type<struct_tag_typet>(to_pointer_type(type).base_type()))
168168
{
169169
return false;
170170
}
171-
const auto &subtype_struct_tag = to_struct_tag_type(type.subtype());
171+
const auto &subtype_struct_tag =
172+
to_struct_tag_type(to_pointer_type(type).base_type());
172173
return is_java_array_tag(subtype_struct_tag.get_identifier());
173174
}
174175

@@ -177,8 +178,9 @@ bool is_java_array_type(const typet &type)
177178
/// an array type.
178179
bool is_multidim_java_array_type(const typet &type)
179180
{
180-
return is_java_array_type(type) && is_java_array_type(java_array_element_type(
181-
to_struct_tag_type(type.subtype())));
181+
return is_java_array_type(type) &&
182+
is_java_array_type(java_array_element_type(
183+
to_struct_tag_type(to_pointer_type(type).base_type())));
182184
}
183185

184186
/// Returns the underlying element type and array dimensionality of Java struct
@@ -190,8 +192,8 @@ java_array_dimension_and_element_type(const struct_tag_typet &type)
190192
typet underlying_type;
191193
for(underlying_type = java_reference_type(type);
192194
is_java_array_type(underlying_type);
193-
underlying_type =
194-
java_array_element_type(to_struct_tag_type(underlying_type.subtype())))
195+
underlying_type = java_array_element_type(to_struct_tag_type(
196+
to_java_reference_type(underlying_type).base_type())))
195197
{
196198
++array_dimensions;
197199
}
@@ -539,7 +541,7 @@ size_t find_closing_semi_colon_for_reference_type(
539541
java_reference_typet java_reference_array_type(const struct_tag_typet &subtype)
540542
{
541543
java_reference_typet result = java_array_type('a');
542-
result.subtype().set(ID_element_type, java_reference_type(subtype));
544+
result.base_type().set(ID_element_type, java_reference_type(subtype));
543545
return result;
544546
}
545547

@@ -892,11 +894,13 @@ bool equal_java_types(const typet &type1, const typet &type2)
892894
bool arrays_with_same_element_type = true;
893895
if(
894896
type1.id() == ID_pointer && type2.id() == ID_pointer &&
895-
type1.subtype().id() == ID_struct_tag &&
896-
type2.subtype().id() == ID_struct_tag)
897+
to_pointer_type(type1).base_type().id() == ID_struct_tag &&
898+
to_pointer_type(type2).base_type().id() == ID_struct_tag)
897899
{
898-
const auto &subtype_symbol1 = to_struct_tag_type(type1.subtype());
899-
const auto &subtype_symbol2 = to_struct_tag_type(type2.subtype());
900+
const auto &subtype_symbol1 =
901+
to_struct_tag_type(to_pointer_type(type1).base_type());
902+
const auto &subtype_symbol2 =
903+
to_struct_tag_type(to_pointer_type(type2).base_type());
900904
if(
901905
subtype_symbol1.get_identifier() == subtype_symbol2.get_identifier() &&
902906
is_java_array_tag(subtype_symbol1.get_identifier()))
@@ -952,7 +956,8 @@ void get_dependencies_from_generic_parameters_rec(
952956
// Java reference type
953957
else if(t.id() == ID_pointer)
954958
{
955-
get_dependencies_from_generic_parameters_rec(t.subtype(), refs);
959+
get_dependencies_from_generic_parameters_rec(
960+
to_pointer_type(t).base_type(), refs);
956961
}
957962

958963
// method type with parameters and return value
@@ -1102,9 +1107,10 @@ std::string pretty_java_type(const typet &type)
11021107
return "byte";
11031108
else if(is_reference(type))
11041109
{
1105-
if(type.subtype().id() == ID_struct_tag)
1110+
if(to_reference_type(type).base_type().id() == ID_struct_tag)
11061111
{
1107-
const auto &struct_tag_type = to_struct_tag_type(type.subtype());
1112+
const auto &struct_tag_type =
1113+
to_struct_tag_type(to_reference_type(type).base_type());
11081114
const irep_idt &id = struct_tag_type.get_identifier();
11091115
if(is_java_array_tag(id))
11101116
return pretty_java_type(java_array_element_type(struct_tag_type)) +

jbmc/src/java_bytecode/remove_instanceof.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ bool remove_instanceoft::lower_instanceof(
176176

177177
if(target_type_is_reference_array)
178178
{
179-
const auto &underlying_type =
180-
to_struct_tag_type(underlying_type_and_dimension.first.subtype());
179+
const auto &underlying_type = to_struct_tag_type(
180+
to_pointer_type(underlying_type_and_dimension.first).base_type());
181181

182182
test_conjuncts.push_back(equal_exprt(
183183
object_class_identifier_field,

jbmc/src/java_bytecode/remove_java_new.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ goto_programt::targett remove_java_newt::lower_java_new(
8888
PRECONDITION(rhs.operands().empty());
8989
PRECONDITION(rhs.type().id() == ID_pointer);
9090
source_locationt location = rhs.source_location();
91-
typet object_type = rhs.type().subtype();
91+
typet object_type = to_pointer_type(rhs.type()).base_type();
9292

9393
// build size expression
9494
const auto object_size = size_of_expr(object_type, ns);
@@ -141,7 +141,8 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
141141
PRECONDITION(rhs.type().id() == ID_pointer);
142142

143143
source_locationt location = rhs.source_location();
144-
struct_tag_typet object_type = to_struct_tag_type(rhs.type().subtype());
144+
struct_tag_typet object_type =
145+
to_struct_tag_type(to_pointer_type(rhs.type()).base_type());
145146
PRECONDITION(ns.follow(object_type).id() == ID_struct);
146147

147148
// build size expression
@@ -201,7 +202,8 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
201202
goto_programt::make_assignment(code_assignt(
202203
object_array_element_type,
203204
constant_exprt(
204-
to_struct_tag_type(underlying_type_and_dimension.first.subtype())
205+
to_struct_tag_type(
206+
to_pointer_type(underlying_type_and_dimension.first).base_type())
205207
.get_identifier(),
206208
string_typet()),
207209
location)));
@@ -307,8 +309,8 @@ goto_programt::targett remove_java_newt::lower_java_new_array(
307309
sub_java_new.operands().erase(sub_java_new.operands().begin());
308310

309311
// we already know that rhs has pointer type
310-
typet sub_type =
311-
static_cast<const typet &>(rhs.type().subtype().find(ID_element_type));
312+
typet sub_type = static_cast<const typet &>(
313+
to_pointer_type(rhs.type()).base_type().find(ID_element_type));
312314
CHECK_RETURN(sub_type.id() == ID_pointer);
313315
sub_java_new.type() = sub_type;
314316

src/analyses/variable-sensitivity/constant_pointer_abstract_object.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ abstract_object_pointert constant_pointer_abstract_objectt::read_dereference(
201201
// Return top if dereferencing a null pointer or we are top
202202
bool is_value_top = is_top() || value_stack.is_top_value();
203203
return env.abstract_object_factory(
204-
type().subtype(), ns, is_value_top, !is_value_top);
204+
to_pointer_type(type()).base_type(), ns, is_value_top, !is_value_top);
205205
}
206206
else
207207
{
@@ -230,7 +230,8 @@ abstract_object_pointert constant_pointer_abstract_objectt::write_dereference(
230230
if(stack.empty())
231231
{
232232
// We should not be changing the type of an abstract object
233-
PRECONDITION(new_value->type() == ns.follow(type().subtype()));
233+
PRECONDITION(
234+
new_value->type() == ns.follow(to_pointer_type(type()).base_type()));
234235

235236
// Get an expression that we can assign to
236237
exprt value = to_address_of_expr(value_stack.to_expression()).object();
@@ -273,7 +274,8 @@ abstract_object_pointert constant_pointer_abstract_objectt::typecast(
273274
{
274275
auto &env = const_cast<abstract_environmentt &>(environment);
275276

276-
auto heap_array_type = array_typet(new_type.subtype(), nil_exprt());
277+
auto heap_array_type =
278+
array_typet(to_pointer_type(new_type).base_type(), nil_exprt());
277279
auto array_object =
278280
environment.abstract_object_factory(heap_array_type, ns, true, false);
279281
auto heap_symbol = symbol_exprt(value.get(ID_identifier), heap_array_type);

src/analyses/variable-sensitivity/full_array_abstract_object.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,8 @@ abstract_object_pointert full_array_abstract_objectt::get_top_entry(
394394
const abstract_environmentt &env,
395395
const namespacet &ns) const
396396
{
397-
return env.abstract_object_factory(type().subtype(), ns, true, false);
397+
return env.abstract_object_factory(
398+
to_type_with_subtype(type()).subtype(), ns, true, false);
398399
}
399400

400401
abstract_object_pointert full_array_abstract_objectt::write_location_context(

src/analyses/variable-sensitivity/value_set_pointer_abstract_object.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ abstract_object_pointert value_set_pointer_abstract_objectt::read_dereference(
7070
if(is_top() || is_bottom())
7171
{
7272
return env.abstract_object_factory(
73-
type().subtype(), ns, is_top(), !is_top());
73+
to_pointer_type(type()).base_type(), ns, is_top(), !is_top());
7474
}
7575

7676
abstract_object_sett results;

src/analyses/variable-sensitivity/variable_sensitivity_domain.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Date: April 2016
1111
#include "variable_sensitivity_domain.h"
1212

1313
#include <util/cprover_prefix.h>
14+
#include <util/pointer_expr.h>
1415
#include <util/symbol_table.h>
1516

1617
#include <algorithm>
@@ -325,7 +326,9 @@ void variable_sensitivity_domaint::transform_function_call(
325326
{
326327
if(
327328
called_arg.type().id() == ID_pointer &&
328-
!called_arg.type().subtype().get_bool(ID_C_constant))
329+
!to_pointer_type(called_arg.type())
330+
.base_type()
331+
.get_bool(ID_C_constant))
329332
{
330333
abstract_object_pointert pointer_value =
331334
abstract_state.eval(called_arg, ns);
@@ -339,7 +342,10 @@ void variable_sensitivity_domaint::transform_function_call(
339342
std::stack<exprt>(),
340343
nil_exprt(),
341344
abstract_state.abstract_object_factory(
342-
called_arg.type().subtype(), ns, true, false),
345+
to_pointer_type(called_arg.type()).base_type(),
346+
ns,
347+
true,
348+
false),
343349
false);
344350
}
345351
}

src/goto-programs/remove_const_function_pointers.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,9 +523,10 @@ bool remove_const_function_pointerst::try_resolve_index_of(
523523
bool all_possible_const=true;
524524
for(const exprt &potential_array_expr : potential_array_exprs)
525525
{
526-
all_possible_const=
526+
all_possible_const =
527527
all_possible_const &&
528-
is_const_type(potential_array_expr.type().subtype());
528+
is_const_type(
529+
to_array_type(potential_array_expr.type()).element_type());
529530

530531
if(potential_array_expr.id()==ID_array)
531532
{

src/pointer-analysis/value_set.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,12 @@ void value_sett::get_value_set_rec(
595595
// integer-to-pointer
596596

597597
if(op.is_zero())
598-
insert(dest, exprt(ID_null_object, expr_type.subtype()), mp_integer{0});
598+
{
599+
insert(
600+
dest,
601+
exprt(ID_null_object, to_type_with_subtype(expr_type).subtype()),
602+
mp_integer{0});
603+
}
599604
else
600605
{
601606
// see if we have something for the integer
@@ -674,11 +679,12 @@ void value_sett::get_value_set_rec(
674679

675680
if(ptr_operand.has_value() && i.has_value())
676681
{
677-
typet pointer_sub_type = ptr_operand->type().subtype();
678-
if(pointer_sub_type.id()==ID_empty)
679-
pointer_sub_type=char_type();
682+
typet pointer_base_type =
683+
to_pointer_type(ptr_operand->type()).base_type();
684+
if(pointer_base_type.id() == ID_empty)
685+
pointer_base_type = char_type();
680686

681-
auto size = pointer_offset_size(pointer_sub_type, ns);
687+
auto size = pointer_offset_size(pointer_base_type, ns);
682688

683689
if(!size.has_value() || (*size) == 0)
684690
{

src/pointer-analysis/value_set_dereference.cpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ exprt value_set_dereferencet::handle_dereference_base_case(
205205
const exprt &pointer,
206206
bool display_points_to_sets)
207207
{ // type of the object
208-
const typet &type=pointer.type().subtype();
208+
const typet &type = to_pointer_type(pointer.type()).base_type();
209209

210210
// collect objects the pointer may point to
211211
const std::vector<exprt> points_to_set =
@@ -335,8 +335,9 @@ bool value_set_dereferencet::dereference_type_compare(
335335
while(object_unwrapped->id() == ID_pointer &&
336336
dereference_unwrapped->id() == ID_pointer)
337337
{
338-
object_unwrapped = &object_unwrapped->subtype();
339-
dereference_unwrapped = &dereference_unwrapped->subtype();
338+
object_unwrapped = &to_pointer_type(*object_unwrapped).base_type();
339+
dereference_unwrapped =
340+
&to_pointer_type(*dereference_unwrapped).base_type();
340341
}
341342
if(dereference_unwrapped->id() == ID_empty)
342343
{
@@ -494,27 +495,28 @@ value_set_dereferencet::valuet value_set_dereferencet::build_reference_to(
494495
const symbolt &memory_symbol=ns.lookup(CPROVER_PREFIX "memory");
495496
const symbol_exprt symbol_expr(memory_symbol.name, memory_symbol.type);
496497

497-
if(memory_symbol.type.subtype() == dereference_type)
498+
if(to_array_type(memory_symbol.type).element_type() == dereference_type)
498499
{
499500
// Types match already, what a coincidence!
500501
// We can use an index expression.
501502

502503
const index_exprt index_expr(
503504
symbol_expr,
504505
pointer_offset(pointer_expr),
505-
memory_symbol.type.subtype());
506+
to_array_type(memory_symbol.type).element_type());
506507

507508
result.value=index_expr;
508509
result.pointer = address_of_exprt{index_expr};
509510
}
510-
else if(
511-
dereference_type_compare(
512-
memory_symbol.type.subtype(), dereference_type, ns))
511+
else if(dereference_type_compare(
512+
to_array_type(memory_symbol.type).element_type(),
513+
dereference_type,
514+
ns))
513515
{
514516
const index_exprt index_expr(
515517
symbol_expr,
516518
pointer_offset(pointer_expr),
517-
memory_symbol.type.subtype());
519+
to_array_type(memory_symbol.type).element_type());
518520
result.value=typecast_exprt(index_expr, dereference_type);
519521
result.pointer =
520522
typecast_exprt{address_of_exprt{index_expr}, pointer_type};
@@ -753,13 +755,16 @@ bool value_set_dereferencet::memory_model_bytes(
753755

754756
// See if we have an array of bytes already,
755757
// and we want something byte-sized.
756-
auto from_type_subtype_size = pointer_offset_size(from_type.subtype(), ns);
758+
auto from_type_element_type_size =
759+
from_type.id() == ID_array
760+
? pointer_offset_size(to_array_type(from_type).element_type(), ns)
761+
: optionalt<mp_integer>{};
757762

758763
auto to_type_size = pointer_offset_size(to_type, ns);
759764

760765
if(
761-
from_type.id() == ID_array && from_type_subtype_size.has_value() &&
762-
*from_type_subtype_size == 1 && to_type_size.has_value() &&
766+
from_type.id() == ID_array && from_type_element_type_size.has_value() &&
767+
*from_type_element_type_size == 1 && to_type_size.has_value() &&
763768
*to_type_size == 1 &&
764769
is_a_bv_type(to_array_type(from_type).element_type()) &&
765770
is_a_bv_type(to_type))

0 commit comments

Comments
 (0)