]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Hash placeholder constraint in ctp_hasher
authorSeyed Sajad Kahani <sska1377@gmail.com>
Thu, 18 Jul 2024 15:01:32 +0000 (16:01 +0100)
committerJason Merrill <jason@redhat.com>
Fri, 19 Jul 2024 02:30:08 +0000 (22:30 -0400)
commit0f8261eae068850c8c48400159fc0a5b540d4d53
tree4fb5e53a4fc7036eb03d6a63a45f8cd2759ddadd
parent02cc8494745c4235890ad58e93b5acce5a89a775
c++: Hash placeholder constraint in ctp_hasher

This patch addresses a difference between the hash function and the equality
function for canonical types of template parameters (ctp_hasher). The equality
function uses comptypes (typeck.cc) (with COMPARE_STRUCTURAL) and checks
constraint equality for two auto nodes (typeck.cc:1586), while the hash
function ignores it (pt.cc:4528). This leads to hash collisions that can be
avoided by using `hash_placeholder_constraint` (constraint.cc:1150).

Note that due to the proper handling of hash collisions (hash-table.h:1059),
there is no test case that can distinguish the current implementation from the
proposed one.

* constraint.cc (hash_placeholder_constraint): Rename to
iterative_hash_placeholder_constraint.
(iterative_hash_placeholder_constraint): Rename from
hash_placeholder_constraint and add the initial val argument.
* cp-tree.h (hash_placeholder_constraint): Rename to
iterative_hash_placeholder_constraint.
(iterative_hash_placeholder_constraint): Renamed from
hash_placeholder_constraint and add the initial val argument.
* pt.cc (struct ctp_hasher): Updated to use
iterative_hash_placeholder_constraint in the case of a valid placeholder
constraint.
(auto_hash::hash): Reflect the renaming of hash_placeholder_constraint to
iterative_hash_placeholder_constraint.
gcc/cp/constraint.cc
gcc/cp/cp-tree.h
gcc/cp/pt.cc