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