From 2febd8772b4b3edde917141f58fb66ae44457474 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 3 Jul 2013 22:20:30 +0200 Subject: [PATCH] re PR c++/57771 (g++ misinterprets >> in static_cast) PR c++/57771 * parser.c (cp_parser_postfix_expression) 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 --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/parser.c | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/template/arg9.C | 8 ++++++++ 4 files changed, 27 insertions(+) create mode 100644 gcc/testsuite/g++.dg/template/arg9.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2de63c0b8d8..92fefea845c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2013-07-03 Jakub Jelinek + + PR c++/57771 + * parser.c (cp_parser_postfix_expression) + 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 6e8293b024e..46a8deb588f 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 e0c5efcba49..410bc213b23 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-07-03 Jakub Jelinek + + PR c++/57771 + * g++.dg/template/arg9.C: New test. + 2013-07-02 Sriraman Tallam * 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 00000000000..41af11486eb --- /dev/null +++ b/gcc/testsuite/g++.dg/template/arg9.C @@ -0,0 +1,8 @@ +// PR c++/57771 +// { dg-do compile } + +template +struct S {}; + +S (4>>2)> s1; +S (4>>2)> s2;