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.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog:

        * module.cc (duplicate_hash::hash): Comment out.
        (trees_in::tree_value): Adjust loop counter.
---
 gcc/cp/module.cc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index f0fb0144706..f259515a498 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -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
@@ -8908,7 +8912,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);

base-commit: e1521b170b44be5cd5d36a98b6b760457b68f566
prerequisite-patch-id: 7e7fc5a2a18d7a60f7db06fcb792fd5e5f7ae636
-- 
2.27.0

Reply via email to