On Wed, Apr 19, 2023 at 12:52:50PM -0400, Jason Merrill wrote: > On 4/19/23 12:05, Patrick Palka wrote: > > On Wed, 19 Apr 2023, Patrick Palka wrote: > > > > > 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? > > OK. > > > > 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? > > Jakub's call, but this regression seems like a blocker to me.
Not doing ggc_free shouldn't really break stuff except increase memory consumption, so I think this is ok for 13.1. > > Now with a reduced testcase: > > > > -- >8 -- > > > > Subject: [PATCH] c++: bad ggc_free in try_class_unification [PR109556] > > > > 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). > > > > gcc/cp/ChangeLog: > > > > * pt.cc (try_class_unification): Don't ggc_free the copy of > > 'targs'. > > > > gcc/testsuite/ChangeLog: > > > > * g++.dg/cpp2a/concepts-placeholder13.C: New test. > > --- > > gcc/cp/pt.cc | 5 ----- > > .../g++.dg/cpp2a/concepts-placeholder13.C | 16 ++++++++++++++++ > > 2 files changed, 16 insertions(+), 5 deletions(-) > > create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-placeholder13.C > > > > 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; > > } > > diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder13.C > > b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder13.C > > new file mode 100644 > > index 00000000000..fd4a05c05e1 > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-placeholder13.C > > @@ -0,0 +1,16 @@ > > +// PR c++/109556 > > +// { dg-do compile { target c++20 } } > > + > > +template<typename T, auto N> > > +concept C = (N != 0); > > + > > +template<auto N, auto M> > > +struct A { }; > > + > > +template<auto N, C<N> auto M> > > +void f(A<N, M>); > > + > > +int main() { > > + f(A<1, 42>{}); > > + f(A<2, 42>{}); > > +} Jakub