@@ -2836,6 +2836,19 @@ check_ret_attributes(State &s, StateValue &&sv, const Type &t,
28362836 return check_return_value (s, std::move (sv), t, attrs, true );
28372837}
28382838
2839+ static void eq_val_rec (State &s, const Type &t, const StateValue &a,
2840+ const StateValue &b) {
2841+ if (auto agg = t.getAsAggregateType ()) {
2842+ for (unsigned i = 0 , e = agg->numElementsConst (); i != e; ++i) {
2843+ if (agg->isPadding (i))
2844+ continue ;
2845+ eq_val_rec (s, agg->getChild (i), agg->extract (a, i), agg->extract (b, i));
2846+ }
2847+ return ;
2848+ }
2849+ s.addUB (a == b);
2850+ }
2851+
28392852StateValue Return::toSMT (State &s) const {
28402853 StateValue retval;
28412854
@@ -2851,12 +2864,8 @@ StateValue Return::toSMT(State &s) const {
28512864 if (attrs.has (FnAttrs::NoReturn))
28522865 s.addUB (expr (false ));
28532866
2854- if (auto *val_returned = s.getFn ().getReturnedInput ()) {
2855- // LangRef states that return type must be valid operands for bitcasts,
2856- // which cannot be aggregate type.
2857- assert (!dynamic_cast <AggregateType *>(&val->getType ()));
2858- s.addUB (retval == s[*val_returned]);
2859- }
2867+ if (auto &val_returned = s.getReturnedInput ())
2868+ eq_val_rec (s, getType (), retval, *val_returned);
28602869
28612870 s.addReturn (std::move (retval));
28622871 return {};
0 commit comments