diff options
author | Jason Merrill <jason@redhat.com> | 2021-06-07 17:51:24 -0400 |
---|---|---|
committer | Jason Merrill <jason@redhat.com> | 2021-06-07 23:54:52 -0400 |
commit | 715614ec3ec5390293e508bb190335d28db1fa8b (patch) | |
tree | 239d32e33207ca9818dffd81724034f6ed161bb3 /gcc | |
parent | a1b3484a8e6c53c8084723e3f1738d402374198e (diff) | |
download | gcc-715614ec3ec5390293e508bb190335d28db1fa8b.zip gcc-715614ec3ec5390293e508bb190335d28db1fa8b.tar.gz gcc-715614ec3ec5390293e508bb190335d28db1fa8b.tar.bz2 |
c++: fix modules binfo merging
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/module.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc index f0fb014..f259515 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); |