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