Hi, extra sanity checking I am going to send in followup patch noticed that we stream pointer types that was never seen by free_lang_data. This is because they are referenced by TYPE_POINTER_TO list and are inserted into the gimple statements later when we wrap everything in MEM_REF (by make_pointer_type).
Bootstrapped/regtested x86_64-linux, OK? Honza * tree.c (find_decls_types_r): Walk also TYPE_NEXT_PTR_TO and TYPE_NEXT_REF_TO. Index: tree.c =================================================================== --- tree.c (revision 263699) +++ tree.c (working copy) @@ -5525,9 +5525,14 @@ find_decls_types_r (tree *tp, int *ws, v fld_worklist_push (TYPE_POINTER_TO (t), fld); fld_worklist_push (TYPE_REFERENCE_TO (t), fld); fld_worklist_push (TYPE_NAME (t), fld); - /* Do not walk TYPE_NEXT_PTR_TO or TYPE_NEXT_REF_TO. We do not stream - them and thus do not and want not to reach unused pointer types - this way. */ + /* While we do not stream TYPE_POINTER_TO and TYPE_REFERENCE_TO + lists, we may look types up in these lists and use them while + optimizing the function body. Thus we need to free lang data + in them. */ + if (TREE_CODE (t) == POINTER_TYPE) + fld_worklist_push (TYPE_NEXT_PTR_TO (t), fld); + if (TREE_CODE (t) == REFERENCE_TYPE) + fld_worklist_push (TYPE_NEXT_REF_TO (t), fld); if (!POINTER_TYPE_P (t)) fld_worklist_push (TYPE_MIN_VALUE_RAW (t), fld); /* TYPE_MAX_VALUE_RAW is TYPE_BINFO for record types. */