Hi!

The following patch uses type_id_in_expr_sentinel in a few spots which
did it all manually.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2024-09-19  Jakub Jelinek  <ja...@redhat.com>

        * parser.cc (cp_parser_postfix_expression): Use
        type_id_in_expr_sentinel instead of manually saving+setting/restoring
        parser->in_type_id_in_expr_p around cp_parser_type_id calls.
        (cp_parser_has_attribute_expression): Likewise.
        (cp_parser_cast_expression): Likewise.
        (cp_parser_sizeof_operand): Likewise.

--- gcc/cp/parser.cc.jj 2024-09-07 09:31:20.708482757 +0200
+++ gcc/cp/parser.cc    2024-09-19 10:46:21.916155154 +0200
@@ -7554,7 +7554,6 @@ cp_parser_postfix_expression (cp_parser
        tree type;
        cp_expr expression;
        const char *saved_message;
-       bool saved_in_type_id_in_expr_p;
 
        /* All of these can be handled in the same way from the point
           of view of parsing.  Begin by consuming the token
@@ -7569,11 +7568,11 @@ cp_parser_postfix_expression (cp_parser
        /* Look for the opening `<'.  */
        cp_parser_require (parser, CPP_LESS, RT_LESS);
        /* Parse the type to which we are casting.  */
-       saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
-       parser->in_type_id_in_expr_p = true;
-       type = cp_parser_type_id (parser, CP_PARSER_FLAGS_TYPENAME_OPTIONAL,
-                                 NULL);
-       parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
+       {
+         type_id_in_expr_sentinel s (parser);
+         type = cp_parser_type_id (parser, CP_PARSER_FLAGS_TYPENAME_OPTIONAL,
+                                   NULL);
+       }
        /* Look for the closing `>'.  */
        cp_parser_require_end_of_template_parameter_list (parser);
        /* Restore the old message.  */
@@ -7643,7 +7642,6 @@ cp_parser_postfix_expression (cp_parser
       {
        tree type;
        const char *saved_message;
-       bool saved_in_type_id_in_expr_p;
 
        /* Consume the `typeid' token.  */
        cp_lexer_consume_token (parser->lexer);
@@ -7658,10 +7656,10 @@ cp_parser_postfix_expression (cp_parser
           expression.  */
        cp_parser_parse_tentatively (parser);
        /* Try a type-id first.  */
-       saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
-       parser->in_type_id_in_expr_p = true;
-       type = cp_parser_type_id (parser);
-       parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
+       {
+         type_id_in_expr_sentinel s (parser);
+         type = cp_parser_type_id (parser);
+       }
        /* Look for the `)' token.  Otherwise, we can't be sure that
           we're not looking at an expression: consider `typeid (int
           (3))', for example.  */
@@ -7916,10 +7914,8 @@ cp_parser_postfix_expression (cp_parser
            else
              {
                /* Parse the type.  */
-               bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
-               parser->in_type_id_in_expr_p = true;
+               type_id_in_expr_sentinel s (parser);
                type = cp_parser_type_id (parser);
-               parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
                parens.require_close (parser);
              }
 
@@ -9502,11 +9498,11 @@ cp_parser_has_attribute_expression (cp_p
      expression.  */
   cp_parser_parse_tentatively (parser);
 
-  bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
-  parser->in_type_id_in_expr_p = true;
-  /* Look for the type-id.  */
-  oper = cp_parser_type_id (parser);
-  parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
+  {
+    type_id_in_expr_sentinel s (parser);
+    /* Look for the type-id.  */
+    oper = cp_parser_type_id (parser);
+  }
 
   cp_parser_parse_definitely (parser);
 
@@ -10268,15 +10264,13 @@ cp_parser_cast_expression (cp_parser *pa
        cp_parser_simulate_error (parser);
       else
        {
-         bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
-         parser->in_type_id_in_expr_p = true;
+         type_id_in_expr_sentinel s (parser);
          /* Look for the type-id.  */
          type = cp_parser_type_id (parser);
          /* Look for the closing `)'.  */
          cp_token *close_paren = parens.require_close (parser);
          if (close_paren)
            close_paren_loc = close_paren->location;
-         parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
        }
 
       /* Restore the saved message.  */
@@ -34299,13 +34293,11 @@ cp_parser_sizeof_operand (cp_parser* par
        cp_parser_simulate_error (parser);
       else
        {
-         bool saved_in_type_id_in_expr_p = parser->in_type_id_in_expr_p;
-         parser->in_type_id_in_expr_p = true;
+         type_id_in_expr_sentinel s (parser);
          /* Look for the type-id.  */
          type = cp_parser_type_id (parser);
          /* Look for the closing `)'.  */
          parens.require_close (parser);
-         parser->in_type_id_in_expr_p = saved_in_type_id_in_expr_p;
        }
 
       /* If all went well, then we're done.  */

        Jakub

Reply via email to