aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2013-07-03 22:20:30 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2013-07-03 22:20:30 +0200
commit2febd8772b4b3edde917141f58fb66ae44457474 (patch)
treee80f097a2cbc25349910aa49adfc9391caf8a878
parente90d15686466770a26d9ea512bef52897511807f (diff)
downloadgcc-2febd8772b4b3edde917141f58fb66ae44457474.zip
gcc-2febd8772b4b3edde917141f58fb66ae44457474.tar.gz
gcc-2febd8772b4b3edde917141f58fb66ae44457474.tar.bz2
re PR c++/57771 (g++ misinterprets >> in static_cast)
PR c++/57771 * parser.c (cp_parser_postfix_expression) <case RID_STATCAST> Temporarily set parser->greater_than_is_operator_p for cp_parser_expression and restore from saved value afterwards. * g++.dg/template/arg9.C: New test. From-SVN: r200647
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/parser.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/template/arg9.C8
4 files changed, 27 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2de63c0..92fefea 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,10 @@
+2013-07-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/57771
+ * parser.c (cp_parser_postfix_expression) <case RID_STATCAST>
+ Temporarily set parser->greater_than_is_operator_p for
+ cp_parser_expression and restore from saved value afterwards.
+
2013-06-28 Ed Smith-Rowland <3dw4rd@verizon.net>
* cp-tree.h (UDLIT_OP_ANSI_PREFIX): Remove space.
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 6e8293b..46a8deb 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -5576,11 +5576,18 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p,
/* Restore the old message. */
parser->type_definition_forbidden_message = saved_message;
+ bool saved_greater_than_is_operator_p
+ = parser->greater_than_is_operator_p;
+ parser->greater_than_is_operator_p = true;
+
/* And the expression which is being cast. */
cp_parser_require (parser, CPP_OPEN_PAREN, RT_OPEN_PAREN);
expression = cp_parser_expression (parser, /*cast_p=*/true, & idk);
cp_parser_require (parser, CPP_CLOSE_PAREN, RT_CLOSE_PAREN);
+ parser->greater_than_is_operator_p
+ = saved_greater_than_is_operator_p;
+
/* Only type conversions to integral or enumeration types
can be used in constant-expressions. */
if (!cast_valid_in_integral_constant_expression_p (type)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e0c5efc..410bc21 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-07-03 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/57771
+ * g++.dg/template/arg9.C: New test.
+
2013-07-02 Sriraman Tallam <tmsriram@google.com>
* gcc.target/i386/avx-inline.c: New test.
diff --git a/gcc/testsuite/g++.dg/template/arg9.C b/gcc/testsuite/g++.dg/template/arg9.C
new file mode 100644
index 0000000..41af114
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/arg9.C
@@ -0,0 +1,8 @@
+// PR c++/57771
+// { dg-do compile }
+
+template <int N>
+struct S {};
+
+S <static_cast <int> (4>>2)> s1;
+S <reinterpret_cast <int> (4>>2)> s2;