Hi! The following testcase used to ICE on the trunk since the clear small object if it has padding optimization before my r15-5746 change, now it doesn't just because type_has_padding_at_level_p isn't called on the testcase.
Though, as the testcase shows, structures/unions which contain erroneous types of one or more of its members can have TREE_TYPE of the FIELD_DECL error_mark_node, on which we can crash. E.g. the __builtin_clear_padding lowering just ignores those: if (TREE_TYPE (field) == error_mark_node) continue; and if (ftype == error_mark_node) continue; It doesn't matter much what exactly we do for those cases, as we are going to fail the compilation anyway, but we shouldn't crash. So, the following patch ignores those in type_has_padding_at_level_p. For RECORD_TYPE, we already return if !DECL_SIZE (f) which I think should cover already the erroneous fields (and we don't use TYPE_SIZE on those). Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-11-29 Jakub Jelinek <ja...@redhat.com> PR middle-end/117065 * gimple-fold.cc (type_has_padding_at_level_p) <case UNION_TYPE>: Also continue if f has error_mark_node type. * gcc.dg/pr117065.c: New test. --- gcc/gimple-fold.cc.jj 2024-11-28 11:38:08.545042716 +0100 +++ gcc/gimple-fold.cc 2024-11-28 18:11:02.613232891 +0100 @@ -4863,7 +4863,7 @@ type_has_padding_at_level_p (tree type) any_fields = false; /* If any of the fields is smaller than the whole, there is padding. */ for (tree f = TYPE_FIELDS (type); f; f = DECL_CHAIN (f)) - if (TREE_CODE (f) != FIELD_DECL) + if (TREE_CODE (f) != FIELD_DECL || TREE_TYPE (f) == error_mark_node) continue; else if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (f)), TYPE_SIZE (type)) != 1) --- gcc/testsuite/gcc.dg/pr117065.c.jj 2024-11-28 18:14:33.526291760 +0100 +++ gcc/testsuite/gcc.dg/pr117065.c 2024-11-28 18:15:15.515706162 +0100 @@ -0,0 +1,12 @@ +/* PR middle-end/117065 */ +/* { dg-do compile } */ +/* { dg-options "-std=gnu23" } */ + +union U { struct A a; unsigned long long b; }; /* { dg-error "field 'a' has incomplete type" } */ + +union U +foo (void) +{ + union U u = { .b = 1 }; + return u; +} Jakub