Am Mittwoch, dem 19.06.2024 um 08:57 +0200 schrieb Richard Biener: > On Wed, 19 Jun 2024, Martin Uecker wrote: > > > Am Mittwoch, dem 19.06.2024 um 08:04 +0200 schrieb Richard Biener: > > > > > > > Am 18.06.2024 um 20:18 schrieb Martin Uecker <uec...@tugraz.at>: > > > > > > > > Am Dienstag, dem 18.06.2024 um 17:27 +0200 schrieb Richard Biener: > > > > > > > > > > > > Am 18.06.2024 um 17:20 schrieb Martin Uecker <uec...@tugraz.at>: > > > > > > > > > > > > > > > > > > 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. > > > > > > > > > > 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. > > > > I would rather like to undertand how this work. Is the following > > correct? > > > > For a type T with TYPE_CANONICAL (T) == S, if we construct a qualified > > type "const" T it would get a const qualified version Q of S as > > canonical type. S has TYPE_CANONICAL (S) == S and Q has > > TYPE_CANONICAL (Q) == Q. > > I think this is a misunderstanding - TYPE_CANONICAL of both T and Q > should be the same (S).
Ok. Then should it, instead of TYPE_CANONICAL (x) = build_qualified_type (TYPE_CANONICAL (t), TYPE_QUALS (x)); be tree c = build_qualified_type (TYPE_CANONICAL (t), TYPE_QUALS (x)); TYPE_CANONICAL (x) = TREE_CANONICAL (c); in the patch below? Martin > > > But the middle end would then ignore this for regular qualifiers > > and use the TYPE_CANONICAL of the main variant for computing > > the aliasing set? > > The middle end uses the canonical type for alias set purposes. > The indirection via TYPE_MAIN_VARIANT shouldn't be necessary. > > > Setting it differently for qualified types would still be important > > so that derived types get their own different TYPE_CANONICAL > > during construction. > > > > > > The other thing I would like to confirm? The alias set is > > initialized to -1 so set later in the middle end based on > > TYPE_CANONICAL (if not set to zero before). This is never > > done before the FE is finished or do we need to worry that > > this may become inconsistent? > > It used to be that -Wstrict-aliasing calls get_alias_set so > TYPE_ALIAS_SET can become set, I don't remember this being > avoided so yes, you'd have to worry about this. Note > TYPE_ALIAS_SET is only ever considered on the canonical type > (but IIRC we have checking code looking at other type alias set). > > Richard. > > > Martin > > > > > Richard > > > > > > > Martin > > > > > > > > > > > > > > Richard > > > > > > > > > > > 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 *); > > > > > > + > > > > > > > > > > > > > > > -- Univ.-Prof. Dr. rer. nat. Martin Uecker Graz University of Technology Institute of Biomedical Imaging