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