Commit 9ccdc43d by Paolo Carlini Committed by Paolo Carlini

re PR c++/84536 (ICE with non-type template parameter)

/cp
2019-02-20  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/84536
	* pt.c (tsubst_init): Diagnose an initializer expanding to an
	empty list of expressions; tweak wrt dependent types.
	(regenerate_decl_from_template): For VAR_DECLs call tsubst_init
	instead of tsubst_expr.

/testsuite
2019-02-20  Paolo Carlini  <paolo.carlini@oracle.com>

	PR c++/84536
	* g++.dg/cpp1y/var-templ60.C: New.

From-SVN: r269037
parent 54603edc
2019-02-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84536
* pt.c (tsubst_init): Diagnose an initializer expanding to an
empty list of expressions; tweak wrt dependent types.
(regenerate_decl_from_template): For VAR_DECLs call tsubst_init
instead of tsubst_expr.
2019-02-19 Jason Merrill <jason@redhat.com> 2019-02-19 Jason Merrill <jason@redhat.com>
PR c++/88368 - wrong 'use of deleted function' PR c++/88368 - wrong 'use of deleted function'
......
...@@ -15422,7 +15422,21 @@ tsubst_init (tree init, tree decl, tree args, ...@@ -15422,7 +15422,21 @@ tsubst_init (tree init, tree decl, tree args,
init = tsubst_expr (init, args, complain, in_decl, false); init = tsubst_expr (init, args, complain, in_decl, false);
if (!init && TREE_TYPE (decl) != error_mark_node) tree type = TREE_TYPE (decl);
if (!init && type != error_mark_node)
{
if (tree auto_node = type_uses_auto (type))
{
if (!CLASS_PLACEHOLDER_TEMPLATE (auto_node))
{
if (complain & tf_error)
error ("initializer for %q#D expands to an empty list "
"of expressions", decl);
return error_mark_node;
}
}
else if (!dependent_type_p (type))
{ {
/* If we had an initializer but it /* If we had an initializer but it
instantiated to nothing, instantiated to nothing,
...@@ -15431,13 +15445,13 @@ tsubst_init (tree init, tree decl, tree args, ...@@ -15431,13 +15445,13 @@ tsubst_init (tree init, tree decl, tree args,
pack expansion where the parameter packs pack expansion where the parameter packs
used in that expansion were of length used in that expansion were of length
zero. */ zero. */
init = build_value_init (TREE_TYPE (decl), init = build_value_init (type, complain);
complain);
if (TREE_CODE (init) == AGGR_INIT_EXPR) if (TREE_CODE (init) == AGGR_INIT_EXPR)
init = get_target_expr_sfinae (init, complain); init = get_target_expr_sfinae (init, complain);
if (TREE_CODE (init) == TARGET_EXPR) if (TREE_CODE (init) == TARGET_EXPR)
TARGET_EXPR_DIRECT_INIT_P (init) = true; TARGET_EXPR_DIRECT_INIT_P (init) = true;
} }
}
return init; return init;
} }
...@@ -24053,9 +24067,8 @@ regenerate_decl_from_template (tree decl, tree tmpl, tree args) ...@@ -24053,9 +24067,8 @@ regenerate_decl_from_template (tree decl, tree tmpl, tree args)
{ {
start_lambda_scope (decl); start_lambda_scope (decl);
DECL_INITIAL (decl) = DECL_INITIAL (decl) =
tsubst_expr (DECL_INITIAL (code_pattern), args, tsubst_init (DECL_INITIAL (code_pattern), decl, args,
tf_error, DECL_TI_TEMPLATE (decl), tf_error, DECL_TI_TEMPLATE (decl));
/*integral_constant_expression_p=*/false);
finish_lambda_scope (); finish_lambda_scope ();
if (VAR_HAD_UNKNOWN_BOUND (decl)) if (VAR_HAD_UNKNOWN_BOUND (decl))
TREE_TYPE (decl) = tsubst (TREE_TYPE (code_pattern), args, TREE_TYPE (decl) = tsubst (TREE_TYPE (code_pattern), args,
......
2019-02-20 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/84536
* g++.dg/cpp1y/var-templ60.C: New.
2019-02-20 Li Jia He <helijia@linux.ibm.com> 2019-02-20 Li Jia He <helijia@linux.ibm.com>
PR target/88100 PR target/88100
......
// PR c++/84536
// { dg-do compile { target c++14 } }
template<int... N> auto foo(N...); // { dg-error "initializer" }
void bar()
{
foo<>();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment