As discussed this replaces the use of check_qualified_type with a simple check for qualifiers as suggested by Jakub in c_update_type_canonical.
Martin Bootstrapped and regression tested on x86_64. C23: Fix ICE related to incomplete structures [PR114930,PR115502]. The fix for PR114574 needs to be further revised because check_qualified_type makes decision based on TYPE_NAME which can be incorrect for C when there are TYPE_DECLS involved. gcc/c/: * c-decl.c (c_update_type_canonical): Do not use check_qualified_type. gcc/testsuite/: * gcc.dg/pr114930.c: New test. * gcc.dg/pr115502.c: New test. diff --git a/gcc/c/c-decl.cc b/gcc/c/c-decl.cc index 01326570e2b..610061a07f8 100644 --- a/gcc/c/c-decl.cc +++ b/gcc/c/c-decl.cc @@ -9374,7 +9374,7 @@ c_update_type_canonical (tree t) if (TYPE_QUALS (x) == TYPE_QUALS (t)) TYPE_CANONICAL (x) = TYPE_CANONICAL (t); else if (TYPE_CANONICAL (t) != t - || check_qualified_type (x, t, TYPE_QUALS (x))) + || TYPE_QUALS (x) != TYPE_QUALS (TYPE_CANONICAL (t))) TYPE_CANONICAL (x) = build_qualified_type (TYPE_CANONICAL (t), TYPE_QUALS (x)); else diff --git a/gcc/testsuite/gcc.dg/pr114930.c b/gcc/testsuite/gcc.dg/pr114930.c new file mode 100644 index 00000000000..5e982fb8929 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr114930.c @@ -0,0 +1,9 @@ +/* { dg-do compile } + * { dg-options "-std=c23 -flto" } */ + +typedef struct WebPPicture WebPPicture; +typedef int (*WebPProgressHook)(const WebPPicture *); +WebPProgressHook progress_hook; +struct WebPPicture { +} WebPGetColorPalette(const struct WebPPicture *); + diff --git a/gcc/testsuite/gcc.dg/pr115502.c b/gcc/testsuite/gcc.dg/pr115502.c new file mode 100644 index 00000000000..02b52622c5a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr115502.c @@ -0,0 +1,9 @@ +/* { dg-do compile } + * { dg-options "-std=c23 -flto" } */ + +typedef struct _OSet OSet; +typedef OSet AvlTree; +void vgPlain_OSetGen_Lookup(const OSet *); +struct _OSet {}; +void vgPlain_OSetGen_Lookup(const AvlTree *); +