===================================================================
@@ -860,6 +860,34 @@ uniquify_nodes (struct data_in *data_in,
if (t == NULL_TREE)
continue;
+ /* Perform very simple TYPE_DECL merging on the type variant
+ chain here. That catches the cases in PR46796, where
+ get_qualified_type fails to lookup an existing qualified
+ type because TYPE_NAME are not pointer-equal. */
+ if (TYPE_P (t)
+ && TYPE_NAME (t)
+ && TREE_CODE (TYPE_NAME (t)) == TYPE_DECL)
+ {
+ tree tn = TYPE_NAME (t);
+ tree t2;
+ for (t2 = TYPE_MAIN_VARIANT (t); t2; t2 = TYPE_NEXT_VARIANT (t2))
+ {
+ tree t2n = TYPE_NAME (t2);
+ if (t2 == t
+ || t2n == tn)
+ continue;
+ if (t2n
+ && TREE_CODE (t2n) == TYPE_DECL
+ && TREE_TYPE (t2n) == TREE_TYPE (tn)
+ && DECL_NAME (t2n) == DECL_NAME (tn)
+ && DECL_SOURCE_LOCATION (t2n) == DECL_SOURCE_LOCATION (tn))
+ {
+ TYPE_NAME (t) = t2n;
+ break;
+ }
+ }
+ }
+
if (TREE_CODE (t) == VAR_DECL)
lto_register_var_decl_in_symtab (data_in, t);
else if (TREE_CODE (t) == FUNCTION_DECL && !DECL_BUILT_IN (t))