On Tue, 4 Jun 2024, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase ICEs in ipa-free-lang, because the
> fld_incomplete_type_of
>           gcc_assert (TYPE_CANONICAL (t2) != t2
>                       && TYPE_CANONICAL (t2) == TYPE_CANONICAL (TREE_TYPE 
> (t)));
> assertion doesn't hold.
> This is because t is a struct S * type which was created while struct S
> was still incomplete and without the may_alias attribute (and TYPE_CANONICAL
> of a pointer type is a type created with can_alias_all = false argument),
> while later on on the struct definition may_alias attribute was used.
> fld_incomplete_type_of then creates an incomplete distinct copy of the
> structure (but with the original attributes) but pointers created for it
> are because of the "may_alias" attribute TYPE_REF_CAN_ALIAS_ALL, including
> their TYPE_CANONICAL, because while that is created with !can_alias_all
> argument, we later set it because of the "may_alias" attribute on the
> to_type.
> 
> This doesn't ICE with C++ since PR70512 fix because the C++ FE sets
> TYPE_REF_CAN_ALIAS_ALL on all pointer types to the class type (and its
> variants) when the may_alias is added.
> 
> The following patch does that in the C FE as well.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk and
> release branches?
> 
> 2024-06-04  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR c/114493
>       * c-decl.cc (c_fixup_may_alias): New function.
>       (finish_struct): Call it if "may_alias" attribute is
>       specified.
> 
>       * gcc.dg/pr114493-1.c: New test.
>       * gcc.dg/pr114493-2.c: New test.

OK.

-- 
Joseph S. Myers
josmy...@redhat.com

Reply via email to