On Thu, May 23, 2024 at 2:00 PM Joseph Myers <josmy...@redhat.com> wrote:
>
> On Tue, 21 May 2024, Martin Uecker wrote:
> >
> >     C: allow aliasing of compatible types derived from enumeral types 
> > [PR115157]
> >
> >     Aliasing of enumeral types with the underlying integer is now allowed
> >     by setting the aliasing set to zero.  But this does not allow aliasing
> >     of derived types which are compatible as required by ISO C.  Instead,
> >     initially set structural equality.  Then set TYPE_CANONICAL and update
> >     pointers and main variants when the type is completed (as done for
> >     structures and unions in C23).
> >
> >     PR 115157
> >
> >     gcc/c/
> >             * c-decl.cc (shadow_tag-warned,parse_xref_tag,start_enum,
> >             finish_enum): Set SET_TYPE_STRUCTURAL_EQUALITY / TYPE_CANONICAL.
> >             * c-obj-common.cc (get_alias_set): Remove special case.
> >             (get_aka_type): Add special case.
> >
> >     gcc/
> >             * godump.cc (go_output_typedef): use TYPE_MAIN_VARIANT instead
> >             of TYPE_CANONICAL.
> >
> >     gcc/testsuite/
> >             * gcc.dg/enum-alias-1.c: New test.
> >             * gcc.dg/enum-alias-2.c: New test.
> >             * gcc.dg/enum-alias-3.c: New test.
>
> OK, in the absence of objections on middle-end or Go grounds within the
> next week.

The godump.cc patch is

       && (TYPE_CANONICAL (TREE_TYPE (decl)) == NULL_TREE
          || !container->decls_seen.contains
-                                   (TYPE_CANONICAL (TREE_TYPE (decl)))))
+                                   (TYPE_MAIN_VARIANT (TREE_TYPE (decl)))))
     {

What is the problem you are seeing?

This patch isn't right:

1) The code is saying if "X == NULL_TREE || !already_seen(X)".  This
patch is changing the latter X but not the former.  They should be
consistent.

2) At the bottom of that conditional block is code that adds a value
to container->decls_seen.  Today that code is adding TYPE_CANONICAL.
If we change the condition to test TYPE_MAIN_VARIANT, then we need to
add TYPE_MAIN_VARIANT to decls_seen.

Hope that makes sense.

I don't know why the patch is required, but it's fine with those
changes as long as the libgo tests continue to pass.

Ian

Reply via email to