From: Paolo Carlini Date: Wed, 20 Feb 2019 10:47:02 +0000 (+0000) Subject: re PR c++/84536 (ICE with non-type template parameter) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9ccdc43d5ee4a3ecdccc10c9d28fc90db6d13eb3;p=gcc.git re PR c++/84536 (ICE with non-type template parameter) /cp 2019-02-20 Paolo Carlini 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 PR c++/84536 * g++.dg/cpp1y/var-templ60.C: New. From-SVN: r269037 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 3fe0cedb0e3..bdbbf841275 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2019-02-20 Paolo Carlini + + 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 PR c++/88368 - wrong 'use of deleted function' diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index a69a17ad3b2..8c5a1b312fc 100644 --- a/gcc/cp/pt.c +++ b/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) - { - /* 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; + 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 + 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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 231a6f3bc6f..cd45bc56c7f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-02-20 Paolo Carlini + + PR c++/84536 + * g++.dg/cpp1y/var-templ60.C: New. + 2019-02-20 Li Jia He PR target/88100 diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ60.C b/gcc/testsuite/g++.dg/cpp1y/var-templ60.C new file mode 100644 index 00000000000..029e65a2097 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ60.C @@ -0,0 +1,9 @@ +// PR c++/84536 +// { dg-do compile { target c++14 } } + +template auto foo(N...); // { dg-error "initializer" } + +void bar() +{ + foo<>(); +}