ESBMC
Efficient SMT-based Context-Bounded Model Checker
Loading...
Searching...
No Matches
goto_program.h
Go to the documentation of this file.
1#ifndef CPROVER_GOTO_PROGRAM_H
2#define CPROVER_GOTO_PROGRAM_H
3
5
6#include <cassert>
7#include <ostream>
8#include <set>
9#include <vector>
10#include <irep2/irep2_utils.h>
11#include <util/irep/location.h>
13#include <util/irep/std_code.h>
14
15#define forall_goto_program_instructions(it, program) \
16 for (goto_programt::instructionst::const_iterator it = \
17 (program).instructions.begin(); \
18 it != (program).instructions.end(); \
19 it++)
20
21#define Forall_goto_program_instructions(it, program) \
22 for (goto_programt::instructionst::iterator it = \
23 (program).instructions.begin(); \
24 it != (program).instructions.end(); \
25 it++)
26
27typedef enum
28{
30 GOTO = 1, // branch, possibly guarded
31 ASSUME = 2, // non-failing guarded self loop
32 ASSERT = 3, // assertions
33 OTHER = 4, // anything else
34 SKIP = 5, // just advance the PC
35 LOCATION = 8, // semantically like SKIP
36 END_FUNCTION = 9, // exit point of a function
37 ATOMIC_BEGIN = 10, // marks a block without interleavings
38 ATOMIC_END = 11, // end of a block without interleavings
39 RETURN = 12, // return from a function
40 ASSIGN = 13, // assignment lhs:=rhs
41 DECL = 14, // declare a local variable
42 DEAD = 15, // marks the end-of-live of a local variable
43 FUNCTION_CALL = 16, // call a function
44 THROW = 17, // throw an exception
45 CATCH = 18, // catch an exception
46 // 19 and 20 were THROW_DECL / THROW_DECL_END, removed in favour of
47 // function-level exception-specification metadata. The numeric values are
48 // left as a gap so the remaining kinds keep their GOTO-binary encoding (and
49 // the in-repo v1 binary fixtures keep loading). A pre-removal binary that
50 // actually contains 19/20 -- only produced from C++ exception-spec code by an
51 // older ESBMC -- has no handler and fails loudly at the symex_step default,
52 // like any other unsupported instruction in a cross-version binary.
53 LOOP_INVARIANT = 21 // loop invariant
55
56std::ostream &operator<<(std::ostream &, goto_program_instruction_typet);
57
63{
64public:
68 inline goto_programt(const goto_programt &src)
69 {
70 // CBMC didn't permit copy-construction, instead requiring calling
71 // copy_from instead. While explicit is better than implicit though,
72 // the only implication of allowing this is the occasional performance
73 // loss, which is best identified by a profiler.
74 copy_from(src);
75 update();
76 }
77
82 {
83 // DO NOT COPY ME! I HAVE POINTERS IN ME!
84 instructions.clear();
85 copy_from(src);
86 update();
87 return *this;
88 }
89
90 bool hide;
91
95 {
96 public:
98
101
104
107
110
116 {
117 std::list<expr2tc> invariants;
118 std::list<expr2tc> assigns_targets; // for frame rule enforcement
119 };
120 std::unique_ptr<loop_contract_datat> loop_contract_data;
121
123 {
125 loop_contract_data = std::make_unique<loop_contract_datat>();
126 return *loop_contract_data;
127 }
128
130 typedef std::list<class instructiont>::iterator targett;
131 typedef std::list<class instructiont>::const_iterator const_targett;
132 typedef std::list<targett> targetst;
133 typedef std::list<const_targett> const_targetst;
134
136
140 {
141 assert(targets.size() == 1);
142 return targets.front();
143 }
144
148 {
149 targets.clear();
150 targets.push_back(t);
151 }
152
153 bool has_target() const
154 {
155 return !targets.empty();
156 }
157
159 typedef std::list<irep_idt> labelst;
161
162 // for k-induction
164
166
167 // Set by optimize_guarded_gotos when "IF !cond GOTO skip; GOTO target" is
168 // folded into "IF cond GOTO target". The guard is then the positive source
169 // condition, so GOTO-taken means the branch body (original target) IS
170 // reached.
172
173 // Set on the nondet assignments the standalone --loop-invariant-check
174 // schema emits in place of a loop. Every claim symex reaches after one of
175 // them is checked against the invariant's over-approximation, so a
176 // violation there means the invariant is too weak to carry the claim, not
177 // that the program can reach the state (issue #7480). A boolean rather
178 // than a test on location.comment(): the combined --loop-invariant pass
179 // emits "loop invariant havoc (verification branch)", whose downstream
180 // claims are *not* abstracted, and that comment is user-visible text
181 // rather than an interface.
183
184 // Set by convert_switch: decimal strings of all case constants whose
185 // target is this GOTO, used by witness waypoint matching. Contains more
186 // than one entry when multiple case labels fall through to the same body.
187 std::vector<std::string> switch_case_ids;
188
190 inline bool is_target() const
191 {
192 return target_number != unsigned(-1);
193 }
194
197 {
198 type = _type;
199 targets.clear();
201 code = expr2tc();
202 loop_contract_data.reset();
204 inductive_assertion = false;
205 flipped_guard = false;
206 loop_invariant_havoc = false;
207 }
208
209 inline void make_goto()
210 {
211 clear(GOTO);
212 }
213
214 inline void make_location(const locationt &l)
215 {
217 location = l;
218 }
219
220 inline void make_return()
221 {
222 clear(RETURN);
223 }
224
225 inline void make_function_call(const expr2tc &_code)
226 {
228 code = _code;
229 }
230
231 inline void make_skip()
232 {
233 clear(SKIP);
234 }
235
236 inline void make_throw()
237 {
238 clear(THROW);
239 }
240
241 inline void make_catch()
242 {
243 clear(CATCH);
244 }
245
246 inline void make_assertion(const expr2tc &g)
247 {
248 clear(ASSERT);
249 guard = g;
250 }
251
252 inline void make_assumption(const expr2tc &g)
253 {
254 clear(ASSUME);
255 guard = g;
256 }
257
258 inline void make_assignment()
259 {
260 clear(ASSIGN);
261 }
262
263 inline void make_other()
264 {
265 clear(OTHER);
266 }
267
268 inline void make_decl()
269 {
270 clear(DECL);
271 }
272
273 inline void make_dead()
274 {
275 clear(DEAD);
276 }
277
278 inline void make_atomic_begin()
279 {
281 }
282
283 inline void make_atomic_end()
284 {
286 }
287
288 inline void make_goto(targett _target)
289 {
290 make_goto();
291 targets.push_back(_target);
292 }
293
294 inline void make_goto(targett _target, const expr2tc &g)
295 {
296 make_goto(_target);
297 guard = g;
298 }
299
300 inline bool is_goto() const
301 {
302 return type == GOTO;
303 }
304
305 inline bool is_return() const
306 {
307 return type == RETURN;
308 }
309
310 inline bool is_assign() const
311 {
312 return type == ASSIGN;
313 }
314
315 inline bool is_function_call() const
316 {
317 return type == FUNCTION_CALL;
318 }
319
320 inline bool is_throw() const
321 {
322 return type == THROW;
323 }
324
325 inline bool is_catch() const
326 {
327 return type == CATCH;
328 }
329
330 inline bool is_skip() const
331 {
332 return type == SKIP;
333 }
334
335 inline bool is_location() const
336 {
337 return type == LOCATION;
338 }
339
340 inline bool is_other() const
341 {
342 return type == OTHER;
343 }
344
345 inline bool is_decl() const
346 {
347 return type == DECL;
348 }
349
350 inline bool is_assume() const
351 {
352 return type == ASSUME;
353 }
354
355 inline bool is_assert() const
356 {
357 return type == ASSERT;
358 }
359
360 inline bool is_loop_invariant() const
361 {
362 return type == LOOP_INVARIANT;
363 }
364
365 inline bool is_atomic_begin() const
366 {
367 return type == ATOMIC_BEGIN;
368 }
369
370 inline bool is_atomic_end() const
371 {
372 return type == ATOMIC_END;
373 }
374
375 inline bool is_end_function() const
376 {
377 return type == END_FUNCTION;
378 }
379
381 : location(static_cast<const locationt &>(get_nil_irep())),
388 loop_number(unsigned(0)),
390 target_number(unsigned(-1))
391 {
393 }
394
396 : location(static_cast<const locationt &>(get_nil_irep())),
397 type(_type),
403 loop_number(unsigned(0)),
405 target_number(unsigned(-1))
406 {
408 }
409
438
440 {
441 instructiont(other).swap(*this);
442 return *this;
443 }
444
446 : code(std::move(other.code)),
447 function(std::move(other.function)),
448 location(std::move(other.location)),
449 type(other.type),
450 guard(std::move(other.guard)),
451 // Move the loop-contract payload — same reasoning as the copy
452 // ctor; without this, move-constructing a LOOP_INVARIANT
453 // instruction loses its invariants.
455 targets(std::move(other.targets)),
456 labels(std::move(other.labels)),
468 {
469 }
470
472 {
473 swap(other);
474 return *this;
475 }
476
478 void swap(instructiont &instruction)
479 {
480 if (this == &instruction)
481 return;
482
483 instruction.code.swap(code);
484 instruction.location.swap(location);
485 std::swap(instruction.type, type);
486 instruction.guard.swap(guard);
487 instruction.targets.swap(targets);
488 // Swap the labels too — copy-assign goes through
489 // `instructiont(other).swap(*this)`, so without swapping
490 // labels here the assignment preserves the LHS's labels
491 // instead of taking the RHS's.
492 instruction.labels.swap(labels);
493 loop_contract_data.swap(instruction.loop_contract_data);
494 instruction.function.swap(function);
495 std::swap(
497 std::swap(inductive_assertion, instruction.inductive_assertion);
498 std::swap(flipped_guard, instruction.flipped_guard);
499 std::swap(loop_invariant_havoc, instruction.loop_invariant_havoc);
500 instruction.switch_case_ids.swap(switch_case_ids);
501 // Swap location_number too — same copy-assign-through-swap
502 // reasoning as for labels.
503 std::swap(instruction.location_number, location_number);
504 std::swap(instruction.loop_number, loop_number);
505 std::swap(instruction.pragma_unroll_count, pragma_unroll_count);
506 std::swap(target_number, instruction.target_number);
507 std::swap(scope_id, instruction.scope_id);
508 std::swap(parent_scope_id, instruction.parent_scope_id);
509 }
510
512 {
513 assert(is_loop_invariant());
515 }
516 std::list<expr2tc> get_loop_invariants() const
517 {
518 return loop_contract_data ? loop_contract_data->invariants
519 : std::list<expr2tc>{};
520 }
521
523 {
524 assert(is_loop_invariant());
525 loop_contract_payload().assigns_targets.push_back(target);
526 }
527 std::list<expr2tc> get_loop_assigns_targets() const
528 {
529 return loop_contract_data ? loop_contract_data->assigns_targets
530 : std::list<expr2tc>{};
531 }
532
537
539 unsigned loop_number;
540
543
547
550 unsigned int scope_id = 0;
551
553 unsigned int parent_scope_id = 0;
554
556 bool is_backwards_goto() const
557 {
558 if (!is_goto())
559 return false;
560
561 for (auto target : targets)
562 if (target->location_number <= location_number)
563 return true;
564
565 return false;
566 }
567
568 bool operator<(const class instructiont i1) const
569 {
570 if (function < i1.function)
571 return true;
572
574 return true;
575
576 return false;
577 }
578
579 void dump() const;
580
582 const class namespacet &ns,
583 const irep_idt &identifier,
584 std::ostream &out,
585 bool show_location = true) const;
586 };
587
588 typedef std::list<class instructiont> instructionst;
589
590 typedef instructionst::iterator targett;
591 typedef instructionst::const_iterator const_targett;
592 typedef std::list<targett> targetst;
593 typedef std::list<const_targett> const_targetst;
594
597
598 void get_successors(const_targett target, const_targetst &successors) const;
599
601 void insert_swap(targett target)
602 {
603 assert(target != instructions.end());
604 const auto next = std::next(target);
605 instructions.insert(next, instructiont())->swap(*target);
606 }
607
610 void insert_swap(targett target, instructiont &instruction)
611 {
612 insert_swap(target);
613 target->swap(instruction);
614 }
615
619 {
620 assert(target != instructions.end());
621 if (p.instructions.empty())
622 return;
623 insert_swap(target, p.instructions.front());
624 auto next = std::next(target);
625 p.instructions.erase(p.instructions.begin());
626 instructions.splice(next, p.instructions);
627 }
628
631 inline targett insert(targett target)
632 {
633 return instructions.insert(target, instructiont());
634 }
635
638 {
639 instructions.splice(instructions.end(), p.instructions);
640 }
641
645 {
646 instructions.splice(target, p.instructions);
647 }
648
652 {
653 instructions.emplace_back();
654 targett tmp = instructions.end();
655 return --tmp;
656 }
657
661 {
662 instructions.emplace_back(instruction);
663 targett tmp = instructions.end();
664 return --tmp;
665 }
666
670 {
671 instructions.emplace_back(type);
672 targett tmp = instructions.end();
673 return --tmp;
674 }
675
677 void dump() const;
678
680 std::ostream &output(
681 const namespacet &ns,
682 const irep_idt &identifier,
683 std::ostream &out) const;
684
692 void
693 update_instructions_function(const irep_idt &function_id, bool force = false)
694 {
695 for (auto &instruction : instructions)
696 {
697 if (force || instruction.function.empty())
698 {
699 instruction.function = function_id;
700 }
701 }
702 }
703
706
708 void compute_location_numbers(unsigned &nr)
709 {
710 for (auto &instruction : instructions)
711 instruction.location_number = nr++;
712 }
713
716 {
717 unsigned nr = 0;
719 }
720
722 void compute_loop_numbers(unsigned int &num);
723
725 void update();
726
728 inline bool empty() const
729 {
730 return instructions.empty();
731 }
732
735 {
736 }
737 virtual ~goto_programt() = default;
738
740 inline void swap(goto_programt &program)
741 {
742 program.instructions.swap(instructions);
743 }
744
746 inline void clear()
747 {
748 instructions.clear();
749 }
750
752 void copy_from(const goto_programt &src);
753
754 typedef std::set<irep_idt> decl_identifierst;
756 void get_decl_identifiers(decl_identifierst &decl_identifiers) const;
757};
758
759bool operator<(
762
764{
765 std::size_t operator()(const goto_programt::const_targett t) const
766 {
767 using hash_typet = decltype(&(*t));
768 return std::hash<hash_typet>{}(&(*t));
769 }
770};
771
775{
776 template <class A, class B>
777 bool operator()(const A &a, const B &b) const
778 {
779 return &(*a) == &(*b);
780 }
781};
782
783#endif
Container for an instruction of the goto-program.
Definition goto_program.h:95
bool inductive_assertion
Definition goto_program.h:165
bool is_end_function() const
Definition goto_program.h:375
void make_atomic_end()
Definition goto_program.h:283
unsigned target_number
Definition goto_program.h:546
void make_atomic_begin()
Definition goto_program.h:278
void make_goto()
Definition goto_program.h:209
std::list< classinstructiont >::iterator targett
the targets for gotos and catch
Definition goto_program.h:130
void clear(goto_program_instruction_typet _type)
clear the node
Definition goto_program.h:196
std::list< expr2tc > get_loop_invariants() const
Definition goto_program.h:516
void make_goto(targett _target)
Definition goto_program.h:288
bool is_goto() const
Definition goto_program.h:300
void make_throw()
Definition goto_program.h:236
std::list< expr2tc > get_loop_assigns_targets() const
Definition goto_program.h:527
instructiont(instructiont &&other)
Definition goto_program.h:445
labelst labels
Definition goto_program.h:160
bool inductive_step_instruction
Definition goto_program.h:163
bool is_assert() const
Definition goto_program.h:355
void dump() const
Definition goto_program.cpp:5
void make_assertion(const expr2tc &g)
Definition goto_program.h:246
bool is_target() const
is this node a branch target?
Definition goto_program.h:190
void make_return()
Definition goto_program.h:220
expr2tc guard
guard for gotos, assume, assert
Definition goto_program.h:109
std::list< classinstructiont >::const_iterator const_targett
Definition goto_program.h:131
void set_target(targett t)
Sets the first (and only) successor for the usual case of a single target.
Definition goto_program.h:147
std::list< targett > targetst
Definition goto_program.h:132
void make_decl()
Definition goto_program.h:268
expr2tc code
Definition goto_program.h:97
instructiont(goto_program_instruction_typet _type)
Definition goto_program.h:395
void make_catch()
Definition goto_program.h:241
void make_function_call(const expr2tc &_code)
Definition goto_program.h:225
void add_loop_assigns_target(const expr2tc &target)
Definition goto_program.h:522
std::vector< std::string > switch_case_ids
Definition goto_program.h:187
void make_goto(targett _target, const expr2tc &g)
Definition goto_program.h:294
bool is_location() const
Definition goto_program.h:335
goto_program_instruction_typet type
what kind of instruction?
Definition goto_program.h:106
void make_skip()
Definition goto_program.h:231
void output_instruction(const class namespacet &ns, const irep_idt &identifier, std::ostream &out, bool show_location=true) const
Definition goto_program.cpp:12
bool is_return() const
Definition goto_program.h:305
unsigned int parent_scope_id
Id of the parent scope for the current "scope_id".
Definition goto_program.h:553
targetst targets
Definition goto_program.h:135
bool is_assume() const
Definition goto_program.h:350
unsigned loop_number
Number unique per function to identify loops.
Definition goto_program.h:539
bool has_target() const
Definition goto_program.h:153
bool is_skip() const
Definition goto_program.h:330
bool is_other() const
Definition goto_program.h:340
void make_other()
Definition goto_program.h:263
std::unique_ptr< loop_contract_datat > loop_contract_data
Definition goto_program.h:120
loop_contract_datat & loop_contract_payload()
Definition goto_program.h:122
bool is_atomic_end() const
Definition goto_program.h:370
unsigned int scope_id
Definition goto_program.h:550
instructiont & operator=(const instructiont &other)
Definition goto_program.h:439
void make_assumption(const expr2tc &g)
Definition goto_program.h:252
unsigned location_number
Definition goto_program.h:536
bool is_backwards_goto() const
Returns true if the instruction is a backwards branch.
Definition goto_program.h:556
bool is_decl() const
Definition goto_program.h:345
locationt location
the location of the instruction in the source file
Definition goto_program.h:103
bool is_atomic_begin() const
Definition goto_program.h:365
std::list< const_targett > const_targetst
Definition goto_program.h:133
bool loop_invariant_havoc
Definition goto_program.h:182
void add_loop_invariant(const expr2tc &invariant)
Definition goto_program.h:511
instructiont & operator=(instructiont &&other)
Definition goto_program.h:471
bool flipped_guard
Definition goto_program.h:171
targett get_target() const
Returns the first (and only) successor for the usual case of a single target.
Definition goto_program.h:139
bool operator<(const class instructiont i1) const
Definition goto_program.h:568
void make_assignment()
Definition goto_program.h:258
instructiont(const instructiont &other)
Definition goto_program.h:410
bool is_loop_invariant() const
Definition goto_program.h:360
bool is_throw() const
Definition goto_program.h:320
bool is_catch() const
Definition goto_program.h:325
bool is_function_call() const
Definition goto_program.h:315
void make_dead()
Definition goto_program.h:273
unsigned pragma_unroll_count
Pragma-specified unroll count (0 = not specified, UINT_MAX = unlimited).
Definition goto_program.h:542
void swap(instructiont &instruction)
swap two instructions
Definition goto_program.h:478
bool is_assign() const
Definition goto_program.h:310
instructiont()
Definition goto_program.h:380
std::list< irep_idt > labelst
goto target labels
Definition goto_program.h:159
void make_location(const locationt &l)
Definition goto_program.h:214
irep_idt function
function this belongs to
Definition goto_program.h:100
A generic container class for a control flow graph for one function, in the form of a goto-program.
Definition goto_program.h:63
instructionst instructions
The list of instructions in the goto program.
Definition goto_program.h:596
void copy_from(const goto_programt &src)
Copy a full goto program, preserving targets.
Definition goto_program.cpp:374
std::list< class instructiont > instructionst
Definition goto_program.h:588
void update_instructions_function(const irep_idt &function_id, bool force=false)
Sets the function member of each instruction if not yet set, or unconditionally when force is true (e...
Definition goto_program.h:693
void clear()
Clear the goto program.
Definition goto_program.h:746
virtual ~goto_programt()=default
void update()
Update all indices.
Definition goto_program.cpp:303
void insert_swap(targett target, instructiont &instruction)
Definition goto_program.h:610
instructionst::iterator targett
Definition goto_program.h:590
instructionst::const_iterator const_targett
Definition goto_program.h:591
targett add_instruction(goto_program_instruction_typet type)
Definition goto_program.h:669
targett add_instruction()
Definition goto_program.h:651
void destructive_append(goto_programt &p)
Appends the given program, which is destroyed.
Definition goto_program.h:637
void compute_loop_numbers(unsigned int &num)
Compute loop numbers.
Definition goto_program.cpp:224
void destructive_insert(targett target, goto_programt &p)
Definition goto_program.h:644
goto_programt()
Constructor.
Definition goto_program.h:734
goto_programt(const goto_programt &src)
copy constructor
Definition goto_program.h:68
std::set< irep_idt > decl_identifierst
Definition goto_program.h:754
std::list< const_targett > const_targetst
Definition goto_program.h:593
void get_successors(const_targett target, const_targetst &successors) const
Definition goto_program.cpp:242
void insert_swap(targett target)
Insertion that preserves jumps to "target".
Definition goto_program.h:601
void compute_location_numbers(unsigned &nr)
Compute location numbers.
Definition goto_program.h:708
void get_decl_identifiers(decl_identifierst &decl_identifiers) const
get the variables in decl statements
Definition goto_program.cpp:484
void dump() const
Output goto program to given stream.
Definition goto_program.cpp:477
goto_programt & operator=(const goto_programt &src)
assignment operator
Definition goto_program.h:81
std::ostream & output(const namespacet &ns, const irep_idt &identifier, std::ostream &out) const
Output goto-program to given stream.
Definition goto_program.cpp:309
void compute_location_numbers()
Compute location numbers.
Definition goto_program.h:715
bool hide
Definition goto_program.h:90
void insert_swap(targett target, goto_programt &p)
Definition goto_program.h:618
void swap(goto_programt &program)
Swap the goto program.
Definition goto_program.h:740
targett insert(targett target)
Definition goto_program.h:631
void compute_target_numbers()
Compute the target numbers.
Definition goto_program.cpp:322
bool empty() const
Is the program empty?
Definition goto_program.h:728
targett add_instruction(instructiont &instruction)
Definition goto_program.h:660
std::list< targett > targetst
Definition goto_program.h:592
Definition witnesses.h:80
friend void swap(irep_container &a, irep_container &b) noexcept
Definition irep2.h:300
Definition irep_idt.h:12
void swap(irep_idt &b)
Definition irep_idt.h:150
void swap(irept &irep)
Definition irep.h:1224
Definition location.h:7
Definition namespace.h:10
@ other
Definition converter_compare.cpp:887
bool operator<(const goto_programt::const_targett i1, const goto_programt::const_targett i2)
Definition goto_program.cpp:215
std::ostream & operator<<(std::ostream &, goto_program_instruction_typet)
Definition goto_program.cpp:414
goto_program_instruction_typet
Definition goto_program.h:28
@ FUNCTION_CALL
Definition goto_program.h:43
@ ATOMIC_END
Definition goto_program.h:38
@ DEAD
Definition goto_program.h:42
@ LOCATION
Definition goto_program.h:35
@ END_FUNCTION
Definition goto_program.h:36
@ RETURN
Definition goto_program.h:39
@ ASSIGN
Definition goto_program.h:40
@ ASSERT
Definition goto_program.h:32
@ ATOMIC_BEGIN
Definition goto_program.h:37
@ LOOP_INVARIANT
Definition goto_program.h:53
@ CATCH
Definition goto_program.h:45
@ SKIP
Definition goto_program.h:34
@ NO_INSTRUCTION_TYPE
Definition goto_program.h:29
@ THROW
Definition goto_program.h:44
@ DECL
Definition goto_program.h:41
@ OTHER
Definition goto_program.h:33
@ GOTO
Definition goto_program.h:30
@ ASSUME
Definition goto_program.h:31
irep_container< expr2t > expr2tc
Definition irep2.h:431
const expr2tc & gen_true_expr()
Definition irep2_utils.h:265
const irept & get_nil_irep()
Definition irep.cpp:18
#define A
Definition logf.c:22
Definition exception.cpp:51
@ identifier
Definition nested_func_transform.cpp:62
struct _ESBMC_Mapping * next
Definition solidity_mapping.c:3
#define false
Definition stdbool.h:10
Definition goto_program.h:764
std::size_t operator()(const goto_programt::const_targett t) const
Definition goto_program.h:765
std::list< expr2tc > invariants
Definition goto_program.h:117
std::list< expr2tc > assigns_targets
Definition goto_program.h:118
Functor to check whether iterators from different collections point at the same object.
Definition goto_program.h:775
bool operator()(const A &a, const B &b) const
Definition goto_program.h:777