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
This commit is contained in:
parent
54603edcb1
commit
9ccdc43d5e
4 changed files with 52 additions and 17 deletions
|
@ -1,3 +1,11 @@
|
|||
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>
|
||||
|
||||
PR c++/88368 - wrong 'use of deleted function'
|
||||
|
|
47
gcc/cp/pt.c
47
gcc/cp/pt.c
|
@ -15422,21 +15422,35 @@ tsubst_init (tree init, tree decl, tree args,
|
|||
|
||||
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 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 (TREE_TYPE (decl),
|
||||
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;
|
||||
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
|
||||
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;
|
||||
|
@ -24053,9 +24067,8 @@ regenerate_decl_from_template (tree decl, tree tmpl, tree args)
|
|||
{
|
||||
start_lambda_scope (decl);
|
||||
DECL_INITIAL (decl) =
|
||||
tsubst_expr (DECL_INITIAL (code_pattern), args,
|
||||
tf_error, DECL_TI_TEMPLATE (decl),
|
||||
/*integral_constant_expression_p=*/false);
|
||||
tsubst_init (DECL_INITIAL (code_pattern), decl, args,
|
||||
tf_error, DECL_TI_TEMPLATE (decl));
|
||||
finish_lambda_scope ();
|
||||
if (VAR_HAD_UNKNOWN_BOUND (decl))
|
||||
TREE_TYPE (decl) = tsubst (TREE_TYPE (code_pattern), args,
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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>
|
||||
|
||||
PR target/88100
|
||||
|
|
9
gcc/testsuite/g++.dg/cpp1y/var-templ60.C
Normal file
9
gcc/testsuite/g++.dg/cpp1y/var-templ60.C
Normal file
|
@ -0,0 +1,9 @@
|
|||
// PR c++/84536
|
||||
// { dg-do compile { target c++14 } }
|
||||
|
||||
template<int... N> auto foo(N...); // { dg-error "initializer" }
|
||||
|
||||
void bar()
|
||||
{
|
||||
foo<>();
|
||||
}
|
Loading…
Add table
Reference in a new issue