Hi!

When parsing static_cast (expression) part inside of template argument,
greater_than_is_operator_p isn't temporarily set and thus the parser
considers >> in C++11 there as end of the the template argument, despite
this appearing before terminating ).

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk/4.8?

2013-07-01  Jakub Jelinek  <ja...@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.

        * g++.dg/template/arg9.C: New test.

--- gcc/cp/parser.c.jj  2013-07-01 22:43:42.000000000 +0200
+++ gcc/cp/parser.c     2013-07-01 22:47:14.220634900 +0200
@@ -5576,11 +5576,18 @@ cp_parser_postfix_expression (cp_parser
        /* 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)
--- gcc/testsuite/g++.dg/template/arg9.C.jj     2013-07-01 22:52:22.780699584 
+0200
+++ gcc/testsuite/g++.dg/template/arg9.C        2013-07-01 22:51:22.000000000 
+0200
@@ -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;

        Jakub

Reply via email to