]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: fix modules binfo merging
authorJason Merrill <jason@redhat.com>
Mon, 7 Jun 2021 21:51:24 +0000 (17:51 -0400)
committerJason Merrill <jason@redhat.com>
Tue, 8 Jun 2021 13:24:06 +0000 (09:24 -0400)
My coming fix for PR91706 caused some regressions in the modules testsuite.
This turned out to be because the change to properly use the base subobject
BINFO as BASELINK_BINFO hit problems with the code for merging binfos.  The
tree reader needed a typo fix.  The duplicate_hash function was crashing on
the BINFO for a variadic base in <variant>.  I started fixing the hash
function, but then noticed that there's no ::equal function defined;
duplicate_hash just uses pointer equality, so we might as well also
use the normal pointer hash for the moment.

gcc/cp/ChangeLog:

* module.cc (duplicate_hash::hash): Comment out.
(trees_in::tree_value): Adjust loop counter.

gcc/cp/module.cc

index 02c19f55548129fe1e898bc9e8b4446a9c061361..b97b1bcb2f8b7ac9f5206c7e224db01c7dc4ce21 100644 (file)
@@ -2820,12 +2820,16 @@ struct merge_key {
 
 struct duplicate_hash : nodel_ptr_hash<tree_node>
 {
+#if 0
+  /* This breaks variadic bases in the xtreme_header tests.  Since ::equal is
+     the default pointer_hash::equal, let's use the default hash as well.  */
   inline static hashval_t hash (value_type decl)
   {
     if (TREE_CODE (decl) == TREE_BINFO)
       decl = TYPE_NAME (BINFO_TYPE (decl));
     return hashval_t (DECL_UID (decl));
   }
+#endif
 };
 
 /* Hashmap of merged duplicates.  Usually decls, but can contain
@@ -8909,7 +8913,7 @@ trees_in::tree_value ()
          dump (dumper::MERGE)
            && dump ("Deduping binfo %N[%u]", type, ix);
          existing = TYPE_BINFO (type);
-         while (existing && ix)
+         while (existing && ix--)
            existing = TREE_CHAIN (existing);
          if (existing)
            register_duplicate (t, existing);