RFA: PATCH to handle_transparent_union_attribute for c++/51228 (ICE on bogus use of transparent_union)
Jakub Jelinek
jakub@redhat.com
Mon Dec 19 13:59:00 GMT 2011
On Wed, Dec 14, 2011 at 05:14:18PM -0500, Jason Merrill wrote:
> --- a/gcc/c-family/c-common.c
> +++ b/gcc/c-family/c-common.c
> @@ -6286,13 +6286,21 @@ handle_transparent_union_attribute (tree *node, tree name,
>
> if (TREE_CODE (type) == UNION_TYPE)
> {
> - /* When IN_PLACE is set, leave the check for FIELDS and MODE to
> - the code in finish_struct. */
> + /* Make sure that the first field will work for a transparent union.
> + If the type isn't complete yet, leave the check to the code in
> + finish_struct. */
> + if (TYPE_SIZE (type))
> + {
> + tree first = first_field (type);
> + if (first == NULL_TREE
> + || TYPE_MODE (type) != DECL_MODE (first))
> + goto ignored;
> + }
I'd think it would be nicer to emit the same diagnostic from this
spot as we do if handle_transparent_union_attribute is called on
an incomplete type and finish_struct is called later.
Unfortunately that varies between C and C++ FEs, we'd need a langhook
for that, which is perhaps an overkill for such rarely used attribute.
So, I'm fine with this patch for the trunk too, though perhaps you
want also
|| first == error_mark_node
|| DECL_ARTIFICIAL (first)
for the condition to catch what finish_struct_1 does for C++?
Jakub
More information about the Gcc-patches
mailing list