@@ -147,12 +147,8 @@ static void check_apply_invariants(
147
147
bool code_contractst::has_contract (const irep_idt fun_name)
148
148
{
149
149
const symbolt &function_symbol = ns.lookup (fun_name);
150
- const code_typet &type = to_code_type (function_symbol.type );
151
- if (type.find (ID_C_spec_assigns).is_not_nil ())
152
- return true ;
153
-
154
- return type.find (ID_C_spec_requires).is_not_nil () ||
155
- type.find (ID_C_spec_ensures).is_not_nil ();
150
+ const auto &type = to_code_with_contract_type (function_symbol.type );
151
+ return type.has_contract ();
156
152
}
157
153
158
154
bool code_contractst::apply_function_contract (
@@ -171,12 +167,12 @@ bool code_contractst::apply_function_contract(
171
167
// components.
172
168
const irep_idt &function = to_symbol_expr (call.function ()).get_identifier ();
173
169
const symbolt &function_symbol = ns.lookup (function);
174
- const code_typet &type = to_code_type (function_symbol.type );
170
+ const auto &type = to_code_with_contract_type (function_symbol.type );
175
171
176
172
// Isolate each component of the contract.
177
- exprt assigns = static_cast < const exprt &>( type.find (ID_C_spec_assigns) );
178
- exprt requires = static_cast < const exprt &>( type.find (ID_C_spec_requires) );
179
- exprt ensures = static_cast < const exprt &>( type.find (ID_C_spec_ensures) );
173
+ exprt assigns = type.assigns ( );
174
+ exprt requires = type.requires ( );
175
+ exprt ensures = type.ensures ( );
180
176
181
177
// Check to see if the function contract actually constrains its effect on
182
178
// the program state; if not, return.
@@ -359,9 +355,8 @@ void code_contractst::populate_assigns_references(
359
355
goto_programt &created_decls,
360
356
std::vector<exprt> &created_references)
361
357
{
362
- const code_typet &type = to_code_type (function_symbol.type );
363
- const exprt &assigns =
364
- static_cast <const exprt &>(type.find (ID_C_spec_assigns));
358
+ const auto &type = to_code_with_contract_type (function_symbol.type );
359
+ const exprt &assigns = type.assigns ();
365
360
366
361
const exprt::operandst &targets = assigns.operands ();
367
362
for (const exprt &curr_op : targets)
@@ -475,7 +470,7 @@ void code_contractst::instrument_call_statement(
475
470
}
476
471
477
472
exprt called_assigns =
478
- static_cast < const exprt &> (called_sym.type . find (ID_C_spec_assigns) );
473
+ to_code_with_contract_type (called_sym.type ). assigns ( );
479
474
if (called_assigns.is_nil ()) // Called function has no assigns clause
480
475
{
481
476
// Fail if called function has no assigns clause.
@@ -618,9 +613,9 @@ bool code_contractst::add_pointer_checks(const std::string &function_name)
618
613
619
614
const irep_idt function_id (function_name);
620
615
const symbolt &function_symbol = ns.lookup (function_id);
621
- const code_typet &type = to_code_type (function_symbol.type );
616
+ const auto &type = to_code_with_contract_type (function_symbol.type );
622
617
623
- exprt assigns = static_cast < const exprt &>( type.find (ID_C_spec_assigns) );
618
+ exprt assigns = type.assigns ( );
624
619
625
620
// Return if there are no reference checks to perform.
626
621
if (assigns.is_nil ())
@@ -752,14 +747,11 @@ void code_contractst::add_contract_check(
752
747
PRECONDITION (!dest.instructions .empty ());
753
748
754
749
const symbolt &function_symbol = ns.lookup (mangled_fun);
755
- const code_typet &code_type = to_code_type (function_symbol.type );
756
-
757
- const exprt &assigns =
758
- static_cast <const exprt &>(code_type.find (ID_C_spec_assigns));
759
- const exprt &requires =
760
- static_cast <const exprt &>(code_type.find (ID_C_spec_requires));
761
- const exprt &ensures =
762
- static_cast <const exprt &>(code_type.find (ID_C_spec_ensures));
750
+ const auto &code_type = to_code_with_contract_type (function_symbol.type );
751
+
752
+ const exprt &assigns = code_type.assigns ();
753
+ const exprt &requires = code_type.requires ();
754
+ const exprt &ensures = code_type.ensures ();
763
755
INVARIANT (
764
756
ensures.is_not_nil () || assigns.is_not_nil (),
765
757
" Code contract enforcement is trivial without an ensures or assigns "
0 commit comments