https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89692

--- Comment #12 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 20 Mar 2019, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89692
> 
> --- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> (In reply to Richard Biener from comment #10)
> > (In reply to Jakub Jelinek from comment #8)
> > > Can't we change that way e.g. TYPE_CANONICAL of some type?
> > 
> > The types are unused, otherwise they'd be visited by fld.
> 
> useless_type_conversion_p still do use TYPE_CANONICAL etc., but fld doesn't
> walk it (unless TYPE_CANONICAL is equal to a type that has been walked (guess
> the usual case):
> 
>       /* Do not walk TYPE_CANONICAL.  We do not stream it and thus do not
>          and want not to reach unused types this way.  */
> 
> > > I would feel much safer if we do this TYPE_NEXT_VARIANT adjustment with 
> > > turning > those types left out into distinct type if we'd 
> > > fld_worklist_push
> > > (TYPE_CANONICAL (type), fld); and so there would be at least sanity in 
> > > what say > later build_qualified_type creates etc.
> > 
> > not sure what you are refering to.  All type-reuse keys on TYPE_MAIN_VARIANT
> > in the end and iff a such freed type is picked up later then FLD misses
> > some important use chain.  The only one that might still come along the
> > type is the garbage collector and I was worried it might go off into
> > cycles if we leave TYPE_NEXT/MAIN_VARIANT unchanged but change the
> > TYPE_MAIN_VARIANT varaint chain.
> 
> I was worried that we visit some type that has TYPE_CANONICAL we don't visit,
> so it is removed from the TYPE_NEXT_VARIANT chain, and if that happens e.g. 
> for
> two variants of the same type, if they have different TYPE_CANONICAL (e.g.
> because of different qualifications), it might cause trouble if those
> TYPE_CANONICALs no longer have the same TYPE_MAIN_VARIANT.

All varaints have the same TYPE_CANONICAL, that of the main variant, and
we never throw away the main variant.  Basically

gcc_assert (TYPE_CANONICAL (t) == TYPE_MAIN_VARIANT (TYPE_CANONICAL (t)) 
== TYPE_CANONICAL (TYPE_MAIN_VARAINT (t)))

holds

Reply via email to