c++: Variable template and template parameter pack [PR96218]

This is DR 2032 which says that the restrictions regarding template
parameter packs and default arguments apply to variable templates as
well, but we weren't detecting that.

gcc/cp/ChangeLog:

	DR 2032
	PR c++/96218
	* pt.c (check_default_tmpl_args): Also consider variable
	templates.

gcc/testsuite/ChangeLog:

	DR 2032
	PR c++/96218
	* g++.dg/cpp1y/var-templ67.C: New test.
This commit is contained in:
Marek Polacek 2020-07-16 09:15:37 -04:00
parent 90b43856fd
commit 50bee766bc
2 changed files with 19 additions and 2 deletions

View File

@ -5482,14 +5482,15 @@ check_default_tmpl_args (tree decl, tree parms, bool is_primary,
/* Don't complain about an enclosing partial
specialization. */
&& parm_level == parms
&& TREE_CODE (decl) == TYPE_DECL
&& (TREE_CODE (decl) == TYPE_DECL || VAR_P (decl))
&& i < ntparms - 1
&& template_parameter_pack_p (TREE_VALUE (parm))
/* A fixed parameter pack will be partially
instantiated into a fixed length list. */
&& !fixed_parameter_pack_p (TREE_VALUE (parm)))
{
/* A primary class template can only have one
/* A primary class template, primary variable template
(DR 2032), or alias template can only have one
parameter pack, at the end of the template
parameter list. */

View File

@ -0,0 +1,16 @@
// DR 2032 - Default template-arguments of variable templates
// PR c++/96218
// { dg-do compile { target c++14 } }
// [temp.param]/14: If a template-parameter of a class template, variable
// template, or alias template has a default template-argument, each subsequent
// template-parameter shall either have a default template-argument supplied or
// be a template parameter pack.
template<typename T = int, typename U>
T vt; // { dg-error "no default argument" }
// [temp.param]/14: If a template-parameter of a primary class template,
// primary variable template, or alias template is a template parameter pack,
// it shall be the last template-parameter.
template<typename... Ts, typename U> // { dg-error "must be at the end" }
int vt2;