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

            Bug ID: 112972
           Summary: ambiguity in specification for cast to union types
           Product: gcc
           Version: 13.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: web
          Assignee: unassigned at gcc dot gnu.org
          Reporter: stephan.stiller at outlook dot com
  Target Milestone: ---

On this page of the GCC documentation
    https://gcc.gnu.org/onlinedocs/gcc/Cast-to-Union.html
the statement that
    the following assignments
      z = (union foo) x;
      z = (union foo) y;
    are shorthand equivalents of these
      z = (union foo) { .i = x };
      z = (union foo) { .d = y };
doesn't give the full picture.

While the statement is accurate about
  union foo
  x
  y
  z
as defined just above, unions with multiple members of the same type would lead
to a potential ambiguity. For example, for Richard Stallman's example of a
union
    union datum {
      double latitude;
      double longitude;
      double height;
      double weight;
      int continent;
    }
(taken from: "GNU C Language Introduction and Reference Manual", Edition 0.0,
section 15.14 (Unions)), casting to this union would be indeterminate with
respect to which of the 4 members of type double is being assigned to.

That is, either (1) first writing to and then reading from identically typed
but differently named members is *not* undefined behavior (and this should be
stated somewhere in the documentation) or (2) a simple "equivalence" between
assignments of the form
    p = (union foo) q;
and assignments of the form
    p = (union foo) { .m = q };
can't exist (due to the ambiguity of which m applies in the case of there being
multiple members of type typeof(q)).

Reply via email to