[Bug c++/109531] [13 Regression] Checking ICE with hash table checking failed: equal operator returns true for a pair of values with a different hash value since r13-3292-gc2565a31c1622a
ppalka at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Apr 17 12:44:41 GMT 2023
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109531
--- Comment #12 from Patrick Palka <ppalka at gcc dot gnu.org> ---
I suppose we're just neglecting to canonicalize a bound ttp's substituted args
before determining its canonical type. Adding a call to coerce_template_parms
or canonicalize_type_argument seems to fix it:
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index fcc8e0d1d57..5ff91414f69 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -16285,9 +16285,18 @@ tsubst (tree t, tree args, tsubst_flags_t complain,
tree in_decl)
return error_mark_node;
tree argvec = tsubst (TI_ARGS (tinfo), args,
complain, in_decl);
+ // this fixes it
+ tree tparms = DECL_INNERMOST_TEMPLATE_PARMS (tmpl);
+ argvec = coerce_template_parms (tparms, argvec,
+ tmpl, complain);
if (argvec == error_mark_node)
return error_mark_node;
+ // or this
+ for (tree& arg : tree_vec_range (argvec))
+ if (TYPE_P (arg))
+ arg = canonicalize_type_argument (arg, complain);
+
TEMPLATE_TEMPLATE_PARM_TEMPLATE_INFO (r)
= build_template_info (tmpl, argvec);
}
More information about the Gcc-bugs
mailing list