From d67b5d8d1db0b9dff3e123a8e2be31cd5634821a Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Mon, 12 Mar 2018 10:40:45 -0400 Subject: [PATCH] PR c++/84355 - ICE with deduction for member class template. * pt.c (tsubst) [TEMPLATE_TYPE_PARM]: Always substitute into CLASS_PLACEHOLDER_TEMPLATE. From-SVN: r258451 --- gcc/cp/ChangeLog | 4 ++++ gcc/cp/pt.c | 3 +-- .../g++.dg/cpp1z/class-deduction50.C | 22 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/class-deduction50.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 703f5970cff..e2373b20064 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2018-03-12 Jason Merrill + PR c++/84355 - ICE with deduction for member class template. + * pt.c (tsubst) [TEMPLATE_TYPE_PARM]: Always substitute into + CLASS_PLACEHOLDER_TEMPLATE. + PR c++/84802 - ICE capturing uninstantiated class. * lambda.c (build_capture_proxy): Call complete_type. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a92b36a6031..4640ca08ce0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14125,8 +14125,7 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl) = tsubst_constraint (constr, args, complain, in_decl); else if (tree pl = CLASS_PLACEHOLDER_TEMPLATE (t)) { - if (DECL_TEMPLATE_TEMPLATE_PARM_P (pl)) - pl = tsubst (pl, args, complain, in_decl); + pl = tsubst_copy (pl, args, complain, in_decl); CLASS_PLACEHOLDER_TEMPLATE (r) = pl; } } diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction50.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction50.C new file mode 100644 index 00000000000..e8cdd8c710f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction50.C @@ -0,0 +1,22 @@ +// PR c++/84355 +// { dg-additional-options -std=c++17 } + +template struct same; +template struct same {}; + +template struct A +{ + template struct B + { + B(U); + }; + + A() { + B b(0); + same>{}; + } +}; + +struct C {}; + +A a; -- 2.30.2