On Thu, Sep 19, 2024 at 10:36:01PM +0200, Jakub Jelinek wrote:
> 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?

Nice cleanup.  Patch looks good to me.
 
> 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
> 

Marek

Reply via email to