diff mbox series

Avoid duplicate variants in free_lang_data

Message ID 20181106155419.zu4dg7ar7rhinkee@kam.mff.cuni.cz
State New
Headers show
Series Avoid duplicate variants in free_lang_data | expand

Commit Message

Jan Hubicka Nov. 6, 2018, 3:54 p.m. UTC
Hi,
this patch fixes another bogus variants created which I noticed by
extra checking code.  fld_type_variant_equal_p copares type name which
are modified by free_lang_data_in_type.  If we first introduce a variant
and then free lang data in the original type, next time we look for same
variant we will fail.

This patch breaks out the logic into fld_simplified_type_name and
makes fld_type_variant_equal_p to anticipate the cleanup which will be done
later.  Bootstrapped/regtested x86_64-linux, comitted as obvious.

Honza

	* tree.c (fld_simplified_type_name): Break out form ...
	(free_lang_data_in_type): ... here.
	(fld_type_variant_equal_p): Use it.
diff mbox series

Patch

Index: tree.c
===================================================================
--- tree.c	(revision 265845)
+++ tree.c	(working copy)
@@ -5083,6 +5083,21 @@  fld_worklist_push (tree t, struct free_l
 
 
 
+/* Return simplified TYPE_NAME of TYPE.  */
+
+static tree
+fld_simplified_type_name (tree type)
+{
+  if (!TYPE_NAME (type) || TREE_CODE (TYPE_NAME (type)) != TYPE_DECL)
+    return TYPE_NAME (type);
+  /* Drop TYPE_DECLs in TYPE_NAME in favor of the identifier in the
+     TYPE_DECL if the type doesn't have linkage.
+     this must match fld_  */
+  if (type != TYPE_MAIN_VARIANT (type) || ! type_with_linkage_p (type))
+    return DECL_NAME (TYPE_NAME (type));
+  return TYPE_NAME (type);
+}
+
 /* Do same comparsion as check_qualified_type skipping lang part of type
    and be more permissive about type names: we only care that names are
    same (for diagnostics) and that ODR names are the same.  */
@@ -5091,8 +5106,8 @@  static bool
 fld_type_variant_equal_p (tree t, tree v)
 {
   if (TYPE_QUALS (t) != TYPE_QUALS (v)
-      || TYPE_NAME (t) != TYPE_NAME (v)
       || TYPE_ALIGN (t) != TYPE_ALIGN (v)
+      || fld_simplified_type_name (t) != fld_simplified_type_name (v)
       || !attribute_list_equal (TYPE_ATTRIBUTES (t),
 			        TYPE_ATTRIBUTES (v)))
     return false;
@@ -5338,12 +5353,11 @@  free_lang_data_in_type (tree type)
     }
 
   /* Drop TYPE_DECLs in TYPE_NAME in favor of the identifier in the
-     TYPE_DECL if the type doesn't have linkage.  */
+     TYPE_DECL if the type doesn't have linkage.
+     this must match fld_  */
   if (type != TYPE_MAIN_VARIANT (type) || ! type_with_linkage_p (type))
-    {
-      TYPE_NAME (type) = TYPE_IDENTIFIER (type);
-      TYPE_STUB_DECL (type) = NULL;
-    }
+    TYPE_STUB_DECL (type) = NULL;
+  TYPE_NAME (type) = fld_simplified_type_name (type);
 }