https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63645

--- Comment #20 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to jos...@codesourcery.com from comment #19)
> Given
> 
>   GnmExprBinary res;
>   GnmExpr const *expr = (GnmExpr *)&res;

Let's consider if in #c11 you change:
  GnmExprBinary *res = malloc (sizeof (GnmExprBinary));
  res->oper = op;
  return (GnmExpr*)res;
to:
  GnmExpr *res = malloc (sizeof (GnmExprBinary));
  res->binary.oper = op;
  return res;
is that also invalid?  I think that pretty much models what GCC does in its
sources, not allocating always the whole size of the union, but sometimes
allocating fewer bytes and sometimes more, based on which field of the union is
going to be used.  Malloc returned pointer should be sufficiently aligned in
this case, just will be smaller than the size of the whole union.

Reply via email to