Struct_type* st = Type::make_struct_type(sfl,
this->location());
st->set_is_struct_incomparable();
+ st->set_is_results_struct();
ins.first->second = st->get_backend(gogo);
}
bresult_struct = ins.first->second;
saw_nonzero = true;
}
go_assert(i == fields->size());
- if (saw_nonzero && lastsize == 0)
+ if (saw_nonzero && lastsize == 0 && !type->is_results_struct())
{
// For nonzero-sized structs which end in a zero-sized thing, we add
// an extra byte of padding to the type. This padding ensures that
Struct_type(Struct_field_list* fields, Location location)
: Type(TYPE_STRUCT),
fields_(fields), location_(location), all_methods_(NULL),
- is_struct_incomparable_(false), has_padding_(false)
+ is_struct_incomparable_(false), has_padding_(false),
+ is_results_struct_(false)
{ }
// Return the field NAME. This only looks at local fields, not at
set_has_padding()
{ this->has_padding_ = true; }
+ // Return whether this is a results struct created to hold the
+ // results of a function that returns multiple results.
+ bool
+ is_results_struct() const
+ { return this->is_results_struct_; }
+
+ // Record that this is a results struct.
+ void
+ set_is_results_struct()
+ { this->is_results_struct_ = true; }
+
// Write the hash function for this type.
void
write_hash_function(Gogo*, Function_type*);
// True if this struct's backend type has padding, due to trailing
// zero-sized field.
bool has_padding_;
+ // True if this is a results struct created to hold the results of a
+ // function that returns multiple results.
+ bool is_results_struct_;
};
// The type of an array.