From b80c64ae1ea0a100115e08fd471a4f3463701fc8 Mon Sep 17 00:00:00 2001 From: jason Date: Tue, 27 Jan 2015 19:16:51 +0000 Subject: [PATCH] PR c++/63889 * pt.c (finish_template_variable): Move from semantics.c. Handle multiple template arg levels. Handle coercion here. (lookup_template_variable): Not here. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@220183 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/pt.c | 23 +++++++++++++++++++---- gcc/cp/semantics.c | 9 --------- gcc/testsuite/g++.dg/cpp1y/var-templ22.C | 14 ++++++++++++++ 4 files changed, 40 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp1y/var-templ22.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ac91652..b914f4b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2015-01-27 Jason Merrill + + PR c++/63889 + * pt.c (finish_template_variable): Move from semantics.c. + Handle multiple template arg levels. Handle coercion here. + (lookup_template_variable): Not here. + 2015-01-23 Jason Merrill PR c++/64314 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index bc26530..d377daa 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -8091,13 +8091,28 @@ tree lookup_template_variable (tree templ, tree arglist) { tree type = unknown_type_node; - tsubst_flags_t complain = tf_warning_or_error; - tree parms = INNERMOST_TEMPLATE_PARMS (DECL_TEMPLATE_PARMS (templ)); - arglist = coerce_template_parms (parms, arglist, templ, complain, - /*req_all*/true, /*use_default*/true); return build2 (TEMPLATE_ID_EXPR, type, templ, arglist); } +/* Instantiate a variable declaration from a TEMPLATE_ID_EXPR for use. */ + +tree +finish_template_variable (tree var) +{ + tree templ = TREE_OPERAND (var, 0); + + tree arglist = TREE_OPERAND (var, 1); + tree tmpl_args = DECL_TI_ARGS (DECL_TEMPLATE_RESULT (templ)); + arglist = add_outermost_template_args (tmpl_args, arglist); + + tree parms = DECL_TEMPLATE_PARMS (templ); + tsubst_flags_t complain = tf_warning_or_error; + arglist = coerce_innermost_template_parms (parms, arglist, templ, complain, + /*req_all*/true, + /*use_default*/true); + + return instantiate_template (templ, arglist, complain); +} struct pair_fn_data { diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 915048d..75aa501 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2454,15 +2454,6 @@ finish_call_expr (tree fn, vec **args, bool disallow_virtual, return result; } -/* Instantiate a variable declaration from a TEMPLATE_ID_EXPR for use. */ - -tree -finish_template_variable (tree var) -{ - return instantiate_template (TREE_OPERAND (var, 0), TREE_OPERAND (var, 1), - tf_error); -} - /* Finish a call to a postfix increment or decrement or EXPR. (Which is indicated by CODE, which should be POSTINCREMENT_EXPR or POSTDECREMENT_EXPR.) */ diff --git a/gcc/testsuite/g++.dg/cpp1y/var-templ22.C b/gcc/testsuite/g++.dg/cpp1y/var-templ22.C new file mode 100644 index 0000000..9ddc925 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1y/var-templ22.C @@ -0,0 +1,14 @@ +// PR c++/63889 +// { dg-do compile { target c++14 } } + +template +struct A +{ + template + static constexpr bool is_ok = true; + + template> + A(T) { } +}; + +A p(42); -- 2.7.4