Am Mittwoch, dem 19.06.2024 um 08:29 +0200 schrieb Jakub Jelinek: > On Wed, Jun 19, 2024 at 08:04:55AM +0200, Richard Biener wrote: > > > > Note a canonical type should always be unqualified (for > > > > classical qualifiers, not address space or atomic qualification) > > > > > > The logic in build_qualified_type is the same as in this patch, > > > it constructs TYPE_CANONICAL with qualifiers. Or what am I > > > missing? > > > > Nothing if you chose to do TYPE_QUALS (canonical) by copy-pasting. > > As I mentioned earlier, I'd prefer the following version and I have > already tested it on the testcases (note, some changes to the tests, > e.g. using lto effective target), just haven't bootstrapped/regtested it > fully yet.
Ok, thanks, I wasn't sure about the conclusion of the discussion. Martin > > gcc/c/ > * c-decl.cc (c_update_type_canonical): Assert t is main variant > with 0 TYPE_QUALS. Simplify and don't use check_qualified_type. > gcc/testsuite/ > * gcc.dg/pr114930.c: New test. > * gcc.dg/pr115502.c: New test. > > --- gcc/c/c-decl.cc.jj 2024-06-07 12:17:09.582969919 +0200 > +++ gcc/c/c-decl.cc 2024-06-18 21:30:22.881904947 +0200 > @@ -9367,18 +9367,16 @@ is_flexible_array_member_p (bool is_last > static void > c_update_type_canonical (tree t) > { > - for (tree x = TYPE_MAIN_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x)) > + gcc_checking_assert (TYPE_MAIN_VARIANT (t) == t && !TYPE_QUALS (t)); > + for (tree x = t; x; x = TYPE_NEXT_VARIANT (x)) > { > if (x != t && TYPE_STRUCTURAL_EQUALITY_P (x)) > { > - if (TYPE_QUALS (x) == TYPE_QUALS (t)) > + if (!TYPE_QUALS (x)) > TYPE_CANONICAL (x) = TYPE_CANONICAL (t); > - else if (TYPE_CANONICAL (t) != t > - || check_qualified_type (x, t, TYPE_QUALS (x))) > + else > TYPE_CANONICAL (x) > = build_qualified_type (TYPE_CANONICAL (t), TYPE_QUALS (x)); > - else > - TYPE_CANONICAL (x) = x; > } > else if (x != t) > continue; > --- gcc/testsuite/gcc.dg/pr114930.c.jj 2024-06-18 21:27:53.782729543 > +0200 > +++ gcc/testsuite/gcc.dg/pr114930.c 2024-06-18 21:27:53.782729543 +0200 > @@ -0,0 +1,9 @@ > +/* PR c/114930 */ > +/* { dg-do compile { target lto } } */ > +/* { dg-options "-std=c23 -flto" } */ > + > +typedef struct WebPPicture WebPPicture; > +typedef int (*WebPProgressHook)(const WebPPicture *); > +WebPProgressHook progress_hook; > +struct WebPPicture { > +} WebPGetColorPalette(const struct WebPPicture *); > --- gcc/testsuite/gcc.dg/pr115502.c.jj 2024-06-18 21:27:53.793729408 > +0200 > +++ gcc/testsuite/gcc.dg/pr115502.c 2024-06-18 21:27:53.793729408 +0200 > @@ -0,0 +1,9 @@ > +/* PR c/115502 */ > +/* { dg-do compile { target lto } } */ > +/* { 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 *); > > Jakub >