aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mmitchel@gcc.gnu.org>2005-10-10 22:30:17 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2005-10-10 22:30:17 +0000
commit5e9edb0f6f337facf312ae8cc0515a7ef057eead (patch)
treee858f516f21edafbc8e0c3431de8e494dfc710dd
parent542155d7087cc47296fa4bfbc642f8a1bb925826 (diff)
downloadgcc-5e9edb0f6f337facf312ae8cc0515a7ef057eead.zip
gcc-5e9edb0f6f337facf312ae8cc0515a7ef057eead.tar.gz
gcc-5e9edb0f6f337facf312ae8cc0515a7ef057eead.tar.bz2
Mark Mitchell <mark@codesourcery.com> PR c++/23437
Mark Mitchell <mark@codesourcery.com> 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. From-SVN: r105199
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/arg4.C9
4 files changed, 32 insertions, 0 deletions
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 <giovannibajo@gcc.gnu.org>
+ Mark Mitchell <mark@codesourcery.com>
+
+ 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 <mark@codesourcery.com>
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 <mark@codesourcery.com>
+
+ PR c++/23437
+ * g++.dg/template/arg4.C: New test.
+
2005-10-10 Eric Botcazou <ebotcazou@libertysurf.fr>
* 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 <void (*p)()> struct S {
+ static const int i = 10;
+};
+
+void g();
+
+int a[S<g>::i];