I've written a patch to fix the transparent_union attribute when the first field in a union is MODE_PARTIAL_INT, but I noticed that the current code only allows the TYPE_MODE of a UNION_TYPE to be of MODE_INT class.
See stor-layout.c (compute_record_mode), particularly this section: /* If we only have one real field; use its mode if that mode's size matches the type's size. This only applies to RECORD_TYPE. This does not apply to unions. */ if (TREE_CODE (type) == RECORD_TYPE && mode != VOIDmode && tree_fits_uhwi_p (TYPE_SIZE (type)) && known_eq (GET_MODE_BITSIZE (mode), tree_to_uhwi (TYPE_SIZE (type)))) ; else mode = mode_for_size_tree (TYPE_SIZE (type), MODE_INT, 1).else_blk (); Is there a reason the type of the union must be of MODE_INT class but a RECORD_TYPE with one field can have the class of it's single field? If the else clause is changed to the following, then transparent_union unions with a first field of double (e.g. gcc/testsuite/g++.dg/ext/transparent-union.C) no longer error. mode = mode_for_size_tree (TYPE_SIZE (type), (GET_MODE_CLASS (mode) != MODE_RANDOM ? GET_MODE_CLASS (mode) : MODE_INT), 1).else_blk (); Could anyone provide some insight on whether the TYPE_MODE of a union should stay as a MODE_INT class or if it would be acceptable for the TYPE_MODE to be other classes e.g. MODE_FLOAT?