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