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.