@@ -549,14 +549,30 @@ void path_symext::assign_rec(
549549
550550 assert (operands.size ()==components.size ());
551551
552- for (std::size_t i=0 ; i<components.size (); i++)
552+ if (ssa_rhs.id ()==ID_struct &&
553+ ssa_rhs.operands ().size ()==components.size ())
553554 {
554- exprt new_rhs=
555- ssa_rhs.is_nil ()?ssa_rhs:
556- simplify_expr (
557- member_exprt (ssa_rhs, components[i].get_name (), components[i].type ()),
558- state.var_map .ns );
559- assign_rec (state, guard, operands[i], new_rhs);
555+ exprt::operandst::const_iterator lhs_it=operands.begin ();
556+ forall_operands (it, ssa_rhs)
557+ {
558+ assign_rec (state, guard, *lhs_it, *it);
559+ ++lhs_it;
560+ }
561+ }
562+ else
563+ {
564+ for (std::size_t i=0 ; i<components.size (); i++)
565+ {
566+ exprt new_rhs=
567+ ssa_rhs.is_nil ()?ssa_rhs:
568+ simplify_expr (
569+ member_exprt (
570+ ssa_rhs,
571+ components[i].get_name (),
572+ components[i].type ()),
573+ state.var_map .ns );
574+ assign_rec (state, guard, operands[i], new_rhs);
575+ }
560576 }
561577 }
562578 else if (ssa_lhs.id ()==ID_array)
@@ -572,36 +588,30 @@ void path_symext::assign_rec(
572588 const exprt::operandst &operands=ssa_lhs.operands ();
573589
574590 // split up into elements
575- for (std::size_t i=0 ; i<operands.size (); i++)
591+ if (ssa_rhs.id ()==ID_array &&
592+ ssa_rhs.operands ().size ()==operands.size ())
576593 {
577- exprt new_rhs=
578- ssa_rhs.is_nil ()?ssa_rhs:
579- simplify_expr (
580- index_exprt (
581- ssa_rhs,
582- from_integer (i, index_type ()), array_type.subtype ()),
583- state.var_map .ns );
584- assign_rec (state, guard, operands[i], new_rhs);
594+ exprt::operandst::const_iterator lhs_it=operands.begin ();
595+ forall_operands (it, ssa_rhs)
596+ {
597+ assign_rec (state, guard, *lhs_it, *it);
598+ ++lhs_it;
599+ }
585600 }
586- }
587- else if (ssa_lhs.id ()==ID_vector)
588- {
589- const vector_typet &vector_type=
590- to_vector_type (state.var_map .ns .follow (ssa_lhs.type ()));
591-
592- const exprt::operandst &operands=ssa_lhs.operands ();
593-
594- // split up into elements
595- for (std::size_t i=0 ; i<operands.size (); i++)
601+ else
596602 {
597- exprt new_rhs=
598- ssa_rhs.is_nil ()?ssa_rhs:
599- simplify_expr (
600- index_exprt (
601- ssa_rhs,
602- from_integer (i, index_type ()), vector_type.subtype ()),
603- state.var_map .ns );
604- assign_rec (state, guard, operands[i], new_rhs);
603+ for (std::size_t i=0 ; i<operands.size (); i++)
604+ {
605+ exprt new_rhs=
606+ ssa_rhs.is_nil ()?ssa_rhs:
607+ simplify_expr (
608+ index_exprt (
609+ ssa_rhs,
610+ from_integer (i, index_type ()),
611+ array_type.subtype ()),
612+ state.var_map .ns );
613+ assign_rec (state, guard, operands[i], new_rhs);
614+ }
605615 }
606616 }
607617 else if (ssa_lhs.id ()==ID_string_constant ||
0 commit comments