Hi
while working on path to replace type variant by first compatible one I run
into issue that the first vairant was not seen by free_lang_data. I think this
is a bug becuase nothing prevents middle-end from looking up a variant there
and using it when it needs to do so.
I tried to walk the variant lists and free lang data on them but that crahses
because not all types in variant list passes verify_type (C++ puts there
incomplete type variants whose canonical type is complete and thus they are
considered bogus). So pruning those lists seems to be better variant.
Bootstrapped/regtested x86_64-linux, OK?
Honza
* tree.c (free_lang_data_in_cgraph): Prune TYPE_NEXT_VARIANT lists.
Index: tree.c
===================================================================
--- tree.c (revision 263989)
+++ tree.c (working copy)
@@ -5845,7 +5845,12 @@ free_lang_data_in_cgraph (void)
/* Traverse every type found freeing its language data. */
FOR_EACH_VEC_ELT (fld.types, i, t)
- free_lang_data_in_type (t);
+ {
+ free_lang_data_in_type (t);
+ while (TYPE_NEXT_VARIANT (t)
+ && !fld.pset.contains (TYPE_NEXT_VARIANT (t)))
+ TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (TYPE_NEXT_VARIANT (t));
+ }
if (flag_checking)
{
FOR_EACH_VEC_ELT (fld.types, i, t)