https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63645
--- Comment #14 from M Welinder <terra at gnome dot org> ---
> 1) Your malloc is too small. It has to be sizeof (biggest member).
> So you're invoking undefined behavior.
Can you produce a specific authoritative reference for that statement?
I.e., a reference to the standard not "because I say so". Note, that
the standard's Section 6.5 #7 says that I *can* accees my GnmExprBinary
object through the union.
> 2) In the if statement, where you probe the different members, you
> also invoke undefined behavior.
Absolutely not! I went other that in painful detail in comment 8.
Bottom line: only one member is accessed.
> Pedantically speaking, the testcase is invalid I think, in C writing
> one union member invalidates all the other union members.
While true as written, there is a read-side exception to that which
allows reading the active union member's fields through certain
inactive union members' fields:
[#5] With one exception, if the value of a member of a union
object is used when the most recent store to the object was
to a different member, the behavior is
implementation-defined.70) One special guarantee is made in
order to simplify the use of unions: If a union contains
several structures that share a common initial sequence (see
below), and if the union object currently contains one of
these structures, it is permitted to inspect the common
initial part of any of them anywhere that a declaration of
the completed type of the union is visible. Two structures
share a common initial sequence if corresponding members
have compatible types (and, for bit-fields, the same widths)
for a sequence of one or more initial members.