From 45b4e1e47fcd8b6b32c98a88eb250d3b3780613b Mon Sep 17 00:00:00 2001 From: mmitchel Date: Mon, 10 Oct 2005 22:30:17 +0000 Subject: [PATCH] Mark Mitchell PR c++/23437 * parser.c (cp_parser_template_argument_list): Do not treat contents of argument list as part of a constant expression. PR c++/23437 * g++.dg/template/arg4.C: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@105199 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/parser.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/arg4.C | 9 +++++++++ 4 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/arg4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 87d5299..390384b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2005-10-10 Giovanni Bajo + Mark Mitchell + + PR c++/23437 + * parser.c (cp_parser_template_argument_list): Do not treat + contents of argument list as part of a constant expression. + 2005-10-10 Mark Mitchell PR c++/24139 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index a4eedc1..e5a03fc 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -8904,9 +8904,18 @@ cp_parser_template_argument_list (cp_parser* parser) tree *arg_ary = fixed_args; tree vec; bool saved_in_template_argument_list_p; + bool saved_ice_p; + bool saved_non_ice_p; saved_in_template_argument_list_p = parser->in_template_argument_list_p; parser->in_template_argument_list_p = true; + /* Even if the template-id appears in an integral + constant-expression, the contents of the argument list do + not. */ + saved_ice_p = parser->integral_constant_expression_p; + parser->integral_constant_expression_p = false; + saved_non_ice_p = parser->non_integral_constant_expression_p; + parser->non_integral_constant_expression_p = false; do { tree argument; @@ -8940,6 +8949,8 @@ cp_parser_template_argument_list (cp_parser* parser) if (arg_ary != fixed_args) free (arg_ary); + parser->non_integral_constant_expression_p = saved_non_ice_p; + parser->integral_constant_expression_p = saved_ice_p; parser->in_template_argument_list_p = saved_in_template_argument_list_p; return vec; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8514a8..9e9dc6e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-10-10 Mark Mitchell + + PR c++/23437 + * g++.dg/template/arg4.C: New test. + 2005-10-10 Eric Botcazou * gcc.dg/ucnid-2.c: XFAIL on Solaris. diff --git a/gcc/testsuite/g++.dg/template/arg4.C b/gcc/testsuite/g++.dg/template/arg4.C new file mode 100644 index 0000000..9c9d9ea --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg4.C @@ -0,0 +1,9 @@ +// PR c++/23437 + +template struct S { + static const int i = 10; +}; + +void g(); + +int a[S::i]; -- 2.7.4