@@ -162,11 +162,11 @@ void goto_symex_statet::assignment(
162
162
bool allow_pointer_unsoundness)
163
163
{
164
164
// identifier should be l0 or l1, make sure it's l1
165
- rename (lhs, ns, L1 );
165
+ rename <L1> (lhs, ns);
166
166
irep_idt l1_identifier=lhs.get_identifier ();
167
167
168
168
// the type might need renaming
169
- rename (lhs.type (), l1_identifier, ns);
169
+ rename <L2> (lhs.type (), l1_identifier, ns);
170
170
lhs.update_type ();
171
171
if (run_validation_checks)
172
172
{
@@ -266,15 +266,13 @@ ssa_exprt
266
266
goto_symex_statet::rename_level0_ssa (ssa_exprt ssa, const namespacet &ns)
267
267
{
268
268
set_l0_indices (ssa, ns);
269
- rename (ssa.type (), ssa.get_identifier (), ns, L0 );
269
+ rename <L0> (ssa.type (), ssa.get_identifier (), ns);
270
270
ssa.update_type ();
271
271
return ssa;
272
272
}
273
273
274
- void goto_symex_statet::rename (
275
- exprt &expr,
276
- const namespacet &ns,
277
- levelt level)
274
+ template <goto_symex_statet::levelt level>
275
+ void goto_symex_statet::rename (exprt &expr, const namespacet &ns)
278
276
{
279
277
// rename all the symbols with their last known value
280
278
@@ -290,13 +288,13 @@ void goto_symex_statet::rename(
290
288
else if (level == L1)
291
289
{
292
290
set_l1_indices (ssa, ns);
293
- rename (expr.type (), ssa.get_identifier (), ns, level );
291
+ rename <level> (expr.type (), ssa.get_identifier (), ns);
294
292
ssa.update_type ();
295
293
}
296
294
else if (level==L2)
297
295
{
298
296
set_l1_indices (ssa, ns);
299
- rename (expr.type (), ssa.get_identifier (), ns, level );
297
+ rename <level> (expr.type (), ssa.get_identifier (), ns);
300
298
ssa.update_type ();
301
299
302
300
if (l2_thread_read_encoding (ssa, ns))
@@ -325,32 +323,27 @@ void goto_symex_statet::rename(
325
323
// we never rename function symbols
326
324
if (as_const (expr).type ().id () == ID_code)
327
325
{
328
- rename (
329
- expr.type (),
330
- to_symbol_expr (expr).get_identifier (),
331
- ns,
332
- level);
333
-
326
+ rename <level>(expr.type (), to_symbol_expr (expr).get_identifier (), ns);
334
327
return ;
335
328
}
336
329
337
330
expr=ssa_exprt (expr);
338
- rename (expr, ns, level );
331
+ rename <level> (expr, ns);
339
332
}
340
333
else if (expr.id ()==ID_address_of)
341
334
{
342
335
auto &address_of_expr = to_address_of_expr (expr);
343
- rename_address (address_of_expr.object (), ns, level );
336
+ rename_address<level> (address_of_expr.object (), ns);
344
337
to_pointer_type (expr.type ()).subtype () =
345
338
as_const (address_of_expr).object ().type ();
346
339
}
347
340
else
348
341
{
349
- rename (expr.type (), irep_idt (), ns, level );
342
+ rename <level> (expr.type (), irep_idt (), ns);
350
343
351
344
// do this recursively
352
345
Forall_operands (it, expr)
353
- rename (*it, ns, level );
346
+ rename <level> (*it, ns);
354
347
355
348
const exprt &c_expr = as_const (expr);
356
349
INVARIANT (
@@ -541,10 +534,8 @@ bool goto_symex_statet::l2_thread_write_encoding(
541
534
return threads.size ()>1 ;
542
535
}
543
536
544
- void goto_symex_statet::rename_address (
545
- exprt &expr,
546
- const namespacet &ns,
547
- levelt level)
537
+ template <goto_symex_statet::levelt level>
538
+ void goto_symex_statet::rename_address (exprt &expr, const namespacet &ns)
548
539
{
549
540
if (expr.id ()==ID_symbol &&
550
541
expr.get_bool (ID_C_SSA_symbol))
@@ -554,42 +545,42 @@ void goto_symex_statet::rename_address(
554
545
// only do L1!
555
546
set_l1_indices (ssa, ns);
556
547
557
- rename (expr.type (), ssa.get_identifier (), ns, level );
548
+ rename <level> (expr.type (), ssa.get_identifier (), ns);
558
549
ssa.update_type ();
559
550
}
560
551
else if (expr.id ()==ID_symbol)
561
552
{
562
553
expr=ssa_exprt (expr);
563
- rename_address (expr, ns, level );
554
+ rename_address<level> (expr, ns);
564
555
}
565
556
else
566
557
{
567
558
if (expr.id ()==ID_index)
568
559
{
569
560
index_exprt &index_expr=to_index_expr (expr);
570
561
571
- rename_address (index_expr.array (), ns, level );
562
+ rename_address<level> (index_expr.array (), ns);
572
563
PRECONDITION (index_expr.array ().type ().id () == ID_array);
573
564
expr.type () = to_array_type (index_expr.array ().type ()).subtype ();
574
565
575
566
// the index is not an address
576
- rename (index_expr.index (), ns, level );
567
+ rename <level> (index_expr.index (), ns);
577
568
}
578
569
else if (expr.id ()==ID_if)
579
570
{
580
571
// the condition is not an address
581
572
if_exprt &if_expr=to_if_expr (expr);
582
- rename (if_expr.cond (), ns, level );
583
- rename_address (if_expr.true_case (), ns, level );
584
- rename_address (if_expr.false_case (), ns, level );
573
+ rename <level> (if_expr.cond (), ns);
574
+ rename_address<level> (if_expr.true_case (), ns);
575
+ rename_address<level> (if_expr.false_case (), ns);
585
576
586
577
if_expr.type ()=if_expr.true_case ().type ();
587
578
}
588
579
else if (expr.id ()==ID_member)
589
580
{
590
581
member_exprt &member_expr=to_member_expr (expr);
591
582
592
- rename_address (member_expr.struct_op (), ns, level );
583
+ rename_address<level> (member_expr.struct_op (), ns);
593
584
594
585
// type might not have been renamed in case of nesting of
595
586
// structs and pointers/arrays
@@ -606,17 +597,17 @@ void goto_symex_statet::rename_address(
606
597
expr.type ()=comp.type ();
607
598
}
608
599
else
609
- rename (expr.type (), irep_idt (), ns, level );
600
+ rename <level> (expr.type (), irep_idt (), ns);
610
601
}
611
602
else
612
603
{
613
604
// this could go wrong, but we would have to re-typecheck ...
614
- rename (expr.type (), irep_idt (), ns, level );
605
+ rename <level> (expr.type (), irep_idt (), ns);
615
606
616
607
// do this recursively; we assume here
617
608
// that all the operands are addresses
618
609
Forall_operands (it, expr)
619
- rename_address (*it, ns, level );
610
+ rename_address<level> (*it, ns);
620
611
}
621
612
}
622
613
}
@@ -674,11 +665,11 @@ static bool requires_renaming(const typet &type, const namespacet &ns)
674
665
return false ;
675
666
}
676
667
668
+ template <goto_symex_statet::levelt level>
677
669
void goto_symex_statet::rename (
678
670
typet &type,
679
671
const irep_idt &l1_identifier,
680
- const namespacet &ns,
681
- levelt level)
672
+ const namespacet &ns)
682
673
{
683
674
// check whether there are symbol expressions in the type; if not, there
684
675
// is no need to expand the struct/union tags in the type
@@ -717,8 +708,8 @@ void goto_symex_statet::rename(
717
708
if (type.id ()==ID_array)
718
709
{
719
710
auto &array_type = to_array_type (type);
720
- rename (array_type.subtype (), irep_idt (), ns, level );
721
- rename (array_type.size (), ns, level );
711
+ rename <level> (array_type.subtype (), irep_idt (), ns);
712
+ rename <level> (array_type.size (), ns);
722
713
}
723
714
else if (type.id () == ID_struct || type.id () == ID_union)
724
715
{
@@ -729,14 +720,14 @@ void goto_symex_statet::rename(
729
720
{
730
721
// be careful, or it might get cyclic
731
722
if (component.type ().id () == ID_array)
732
- rename (to_array_type (component.type ()).size (), ns, level );
723
+ rename <level> (to_array_type (component.type ()).size (), ns);
733
724
else if (component.type ().id () != ID_pointer)
734
- rename (component.type (), irep_idt (), ns, level );
725
+ rename <level> (component.type (), irep_idt (), ns);
735
726
}
736
727
}
737
728
else if (type.id ()==ID_pointer)
738
729
{
739
- rename (to_pointer_type (type).subtype (), irep_idt (), ns, level );
730
+ rename <level> (to_pointer_type (type).subtype (), irep_idt (), ns);
740
731
}
741
732
742
733
if (level==L2 &&
0 commit comments