Aside from correcting how try_class_unification copies multi-dimensional 'targs', r13-377-g3e948d645bc908 also made it ggc_free this copy as an optimization. But this is potentially wrong since the call to unify within might've captured the args in persistent memory such as the satisfaction cache (during constrained auto deduction).
Bootstrapped and regtested on x86_64-pc-linux, does this look OK for trunk/13? No testcase yet since the reduction is still in progress. The plan would be to push this with a reduced testcase, but I figured I'd send the actual fix for review now. Would this be OK for 13.1 or shall it wait until 13.2? gcc/cp/ChangeLog: * pt.cc (try_class_unification): Don't ggc_free the copy of 'targs'. --- gcc/cp/pt.cc | 5 ----- 1 file changed, 5 deletions(-) diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index e065ace5c55..68a056acf8b 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -23895,11 +23895,6 @@ try_class_unification (tree tparms, tree targs, tree parm, tree arg, err = unify (tparms, targs, CLASSTYPE_TI_ARGS (parm), CLASSTYPE_TI_ARGS (arg), UNIFY_ALLOW_NONE, explain_p); - if (TMPL_ARGS_HAVE_MULTIPLE_LEVELS (targs)) - for (tree level : tree_vec_range (targs)) - ggc_free (level); - ggc_free (targs); - return err ? NULL_TREE : arg; } -- 2.40.0.352.g667fcf4e15