From 3a285529ee338ef2867ae7add26b6493f004bf0d Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 14 Mar 2020 17:10:39 -0400 Subject: [PATCH] c++: Fix ICE-after-error on partial spec [92068] Here the template arguments for the partial specialization are valid arguments for the template, but not for a partial specialization, because 'd' can never be deduced to anything other than an empty pack. gcc/cp/ChangeLog 2020-03-14 Jason Merrill PR c++/92068 * pt.c (process_partial_specialization): Error rather than crash on extra pack expansion. --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/pt.c | 9 ++++++++- gcc/testsuite/g++.dg/cpp0x/variadic178.C | 6 ++++++ 3 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/variadic178.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bb7f590ea0b..c9375234c41 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2020-03-14 Jason Merrill + + PR c++/92068 + * pt.c (process_partial_specialization): Error rather than crash on + extra pack expansion. + 2020-03-14 Jason Merrill PR c++/92909 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index bd2f9be82ea..48ac48615a0 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -5038,6 +5038,14 @@ process_partial_specialization (tree decl) return decl; } + else if (nargs > DECL_NTPARMS (maintmpl)) + { + error ("too many arguments for partial specialization %qT", type); + inform (DECL_SOURCE_LOCATION (maintmpl), "primary template here"); + /* Avoid crash below. */ + return decl; + } + /* If we aren't in a dependent class, we can actually try deduction. */ else if (tpd.level == 1 /* FIXME we should be able to handle a partial specialization of a @@ -5064,7 +5072,6 @@ process_partial_specialization (tree decl) Also, we verify that pack expansions only occur at the end of the argument list. */ - gcc_assert (nargs == DECL_NTPARMS (maintmpl)); tpd2.parms = 0; for (i = 0; i < nargs; ++i) { diff --git a/gcc/testsuite/g++.dg/cpp0x/variadic178.C b/gcc/testsuite/g++.dg/cpp0x/variadic178.C new file mode 100644 index 00000000000..f0e65958de3 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/variadic178.C @@ -0,0 +1,6 @@ +// PR c++/92068 +// { dg-do compile { target c++11 } } + +template struct a; +template +struct a { }; // { dg-error "arguments" } -- 2.30.2