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,21 +15422,35 @@ tsubst_init (tree init, tree decl, tree args, ...@@ -15422,21 +15422,35 @@ 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 we had an initializer but it if (!init && type != error_mark_node)
instantiated to nothing, {
value-initialize the object. This will if (tree auto_node = type_uses_auto (type))
only occur when the initializer was a {
pack expansion where the parameter packs if (!CLASS_PLACEHOLDER_TEMPLATE (auto_node))
used in that expansion were of length {
zero. */ if (complain & tf_error)
init = build_value_init (TREE_TYPE (decl), error ("initializer for %q#D expands to an empty list "
complain); "of expressions", decl);
if (TREE_CODE (init) == AGGR_INIT_EXPR) return error_mark_node;
init = get_target_expr_sfinae (init, complain); }
if (TREE_CODE (init) == TARGET_EXPR) }
TARGET_EXPR_DIRECT_INIT_P (init) = true; else if (!dependent_type_p (type))
{
/* If we had an initializer but it
instantiated to nothing,
value-initialize the object. This will
only occur when the initializer was a
pack expansion where the parameter packs
used in that expansion were of length
zero. */
init = build_value_init (type, complain);
if (TREE_CODE (init) == AGGR_INIT_EXPR)
init = get_target_expr_sfinae (init, complain);
if (TREE_CODE (init) == TARGET_EXPR)
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