[Bug c/114493] [11/12/13/14/15 Regression] internal compiler error: in fld_incomplete_type_of with may_alias
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114493 --- Comment #12 from GCC Commits --- The releases/gcc-14 branch has been updated by Jakub Jelinek : https://gcc.gnu.org/g:56c73729c3eab08ca48f366bd435f98457743e45 commit r14-10286-g56c73729c3eab08ca48f366bd435f98457743e45 Author: Jakub Jelinek Date: Thu Jun 6 22:12:11 2024 +0200 c: Fix up pointer types to may_alias structures [PR114493] 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. 2024-06-06 Jakub Jelinek 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. (cherry picked from commit d5a3c6d43acb8b2211d9fb59d59482d74c010f01)
[Bug c/114493] [11/12/13/14/15 Regression] internal compiler error: in fld_incomplete_type_of with may_alias
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114493 --- Comment #11 from GCC Commits --- The master branch has been updated by Jakub Jelinek : https://gcc.gnu.org/g:d5a3c6d43acb8b2211d9fb59d59482d74c010f01 commit r15-1080-gd5a3c6d43acb8b2211d9fb59d59482d74c010f01 Author: Jakub Jelinek Date: Thu Jun 6 22:12:11 2024 +0200 c: Fix up pointer types to may_alias structures [PR114493] 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. 2024-06-06 Jakub Jelinek 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.
[Bug c/114493] [11/12/13/14/15 Regression] internal compiler error: in fld_incomplete_type_of with may_alias
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114493 --- Comment #10 from Jakub Jelinek --- Created attachment 58337 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=58337=edit gcc15-pr114493.patch Untested fix.
[Bug c/114493] [11/12/13/14/15 Regression] internal compiler error: in fld_incomplete_type_of with may_alias
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114493 --- Comment #9 from Jakub Jelinek --- That was added for C++ in PR70512.
[Bug c/114493] [11/12/13/14/15 Regression] internal compiler error: in fld_incomplete_type_of with may_alias
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114493 Jakub Jelinek changed: What|Removed |Added CC||jakub at gcc dot gnu.org --- Comment #8 from Jakub Jelinek --- This doesn't ICE in C++, because the C++ FE forcibly updates the corresponding pointer types in: #0 fixup_may_alias (klass=) at ../../gcc/cp/class.cc:2328 #1 0x00456835 in fixup_attribute_variants (t=) at ../../gcc/cp/class.cc:2354 #2 0x006f3024 in cp_parser_class_head (parser=0x7fffea2dea80, nested_name_specifier_p=0x7fffd5ff) at ../../gcc/cp/parser.cc:27831 /* KLASS is a class that we're applying may_alias to after the body is parsed. Fixup any POINTER_TO and REFERENCE_TO types. The canonical type(s) will be implicitly updated. */ static void fixup_may_alias (tree klass) { tree t, v; for (t = TYPE_POINTER_TO (klass); t; t = TYPE_NEXT_PTR_TO (t)) for (v = TYPE_MAIN_VARIANT (t); v; v = TYPE_NEXT_VARIANT (v)) TYPE_REF_CAN_ALIAS_ALL (v) = true; for (t = TYPE_REFERENCE_TO (klass); t; t = TYPE_NEXT_REF_TO (t)) for (v = TYPE_MAIN_VARIANT (t); v; v = TYPE_NEXT_VARIANT (v)) TYPE_REF_CAN_ALIAS_ALL (v) = true; } Now, fixup_attribute_variants also does: for (variants = TYPE_NEXT_VARIANT (t); variants; variants = TYPE_NEXT_VARIANT (variants)) { /* These are the two fields that check_qualified_type looks at and are affected by attributes. */ TYPE_ATTRIBUTES (variants) = attrs; unsigned valign = align; if (TYPE_USER_ALIGN (variants)) valign = MAX (valign, TYPE_ALIGN (variants)); else TYPE_USER_ALIGN (variants) = user_align; SET_TYPE_ALIGN (variants, valign); TYPE_PACKED (variants) = packed; if (may_alias) fixup_may_alias (variants); } I think the TYPE_ATTRIBUTES update isn't needed, because decl_attributes (, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE); should update the variants already: 984 TYPE_ATTRIBUTES (*anode) = r; 985 /* If this is the main variant, also push the attributes 986 out to the other variants. */ 987 if (*anode == TYPE_MAIN_VARIANT (*anode)) 988 { 989 for (tree variant = *anode; variant; 990variant = TYPE_NEXT_VARIANT (variant)) 991 { 992 if (TYPE_ATTRIBUTES (variant) == old_attrs) 993 TYPE_ATTRIBUTES (variant) 994 = TYPE_ATTRIBUTES (*anode); 995 else if (!find_same_attribute 996(attr, TYPE_ATTRIBUTES (variant))) 997 TYPE_ATTRIBUTES (variant) = tree_cons 998 (name, args, TYPE_ATTRIBUTES (variant)); 999 } 1000} Seems finish_struct doesn't actually call layout_type on the type variants, wonder what does that, but I'd think that stuff like TYPE_USER_ALIGN, TYPE_ALIGN would be finalized when layout_type is performed for those. TYPE_PACKED is apparently done in finish_record_layout even for the variants (called from layout_type).
[Bug c/114493] [11/12/13/14/15 Regression] internal compiler error: in fld_incomplete_type_of with may_alias
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114493 Sam James changed: What|Removed |Added CC||fw at gcc dot gnu.org --- Comment #7 from Sam James --- I've been scratching my head as to why matoro and someone else reported it with Samba today out of nowhere. I assume it's because of https://sourceware.org/git/?p=glibc.git;a=commit;h=26e7005728f0eea2972474e6be2905c467661237. I think it was suggested that a forward decl might work to mitigate the ICE but I haven't tried (yet).