aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2007-10-26 13:57:46 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2007-10-26 13:57:46 +0200
commit0f1e332126d1a3bc3c6048bad324049b9f423020 (patch)
tree0f2100f84eda6d636341fd372ff10793572e611e
parent9b70c6b0780bc6fef0278d6af9f551bc3f21eaa3 (diff)
downloadgcc-0f1e332126d1a3bc3c6048bad324049b9f423020.zip
gcc-0f1e332126d1a3bc3c6048bad324049b9f423020.tar.gz
gcc-0f1e332126d1a3bc3c6048bad324049b9f423020.tar.bz2
re PR c++/33744 (function-style cast and '>' not allowed in template argument)
PR c++/33744 * parser.c (cp_parser_parenthesized_expression_list): Set greater_than_is_operator_p to true in between the parens. * g++.dg/template/arg6.C: New test. From-SVN: r129648
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/parser.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/arg6.C15
4 files changed, 41 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e345e75..cabde87 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2007-10-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/33744
+ * parser.c (cp_parser_parenthesized_expression_list): Set
+ greater_than_is_operator_p to true in between the parens.
+
2007-10-26 Paolo Carlini <pcarlini@suse.de>
PR c++/31747
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 8e48b16..0b94375 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -4976,6 +4976,7 @@ cp_parser_parenthesized_expression_list (cp_parser* parser,
tree expression_list = NULL_TREE;
bool fold_expr_p = is_attribute_list;
tree identifier = NULL_TREE;
+ bool saved_greater_than_is_operator_p;
/* Assume all the expressions will be constant. */
if (non_constant_p)
@@ -4984,6 +4985,12 @@ cp_parser_parenthesized_expression_list (cp_parser* parser,
if (!cp_parser_require (parser, CPP_OPEN_PAREN, "`('"))
return error_mark_node;
+ /* Within a parenthesized expression, a `>' token is always
+ the greater-than operator. */
+ saved_greater_than_is_operator_p
+ = parser->greater_than_is_operator_p;
+ parser->greater_than_is_operator_p = true;
+
/* Consume expressions until there are no more. */
if (cp_lexer_next_token_is_not (parser->lexer, CPP_CLOSE_PAREN))
while (true)
@@ -5069,9 +5076,16 @@ cp_parser_parenthesized_expression_list (cp_parser* parser,
if (ending < 0)
goto get_comma;
if (!ending)
- return error_mark_node;
+ {
+ parser->greater_than_is_operator_p
+ = saved_greater_than_is_operator_p;
+ return error_mark_node;
+ }
}
+ parser->greater_than_is_operator_p
+ = saved_greater_than_is_operator_p;
+
/* We built up the list in reverse order so we must reverse it now. */
expression_list = nreverse (expression_list);
if (identifier)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 17252b2..0293ed0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-10-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/33744
+ * g++.dg/template/arg6.C: New test.
+
2007-10-26 Paolo Carlini <pcarlini@suse.de>
PR c++/31747
diff --git a/gcc/testsuite/g++.dg/template/arg6.C b/gcc/testsuite/g++.dg/template/arg6.C
new file mode 100644
index 0000000..ef05aba
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/arg6.C
@@ -0,0 +1,15 @@
+// PR c++/33744
+// { dg-do run }
+
+template <bool B> struct A { bool b; A() : b(B) {}; };
+A<bool(1)> a;
+A<bool(1<2)> b;
+A<(bool)(2>1)> c;
+A<bool((2>1))> d;
+A<bool(2>1)> e;
+
+int
+main ()
+{
+ return (a.b && b.b && c.b && d.b && e.b) ? 0 : 1;
+}