Thanks for the feedback. I am attatching fixed patch as a file. Regards Franciszek
On Mon, 19 Aug 2024, 18:32 Jason Merrill, <ja...@redhat.com> wrote: > On 8/19/24 12:01 PM, Jason Merrill wrote: > > On 8/19/24 6:01 AM, Jonathan Wakely wrote: > >> On 05/08/24 09:32 +0200, Franciszek Witt wrote: > >>> Author: Franciszek Witt <franek.w...@gmail.com> > >>> Date: Mon Aug 5 09:00:35 2024 +0200 > >>> > >>> c++: [PR101232] > >> > >> The line above should be the first line of your Git commit message, > >> which should be in the form "component: Summary of change [PRnnnn]" > >> The Subject: of your email seems like it should be repeated here > >> (although something shorter would be even nicer, if possible). > >> https://cbea.ms/git-commit/ > >> > >> > >>> PR c++/101232 > >>> > >>> gcc/cp/ChangeLog: > >>> > >>> * parser.cc (cp_parser_postfix_expression): Commit to the > >>> parse in case we know its either a cast or invalid syntax. > >>> (cp_parser_braced_list): Add a heuristic to inform about > >>> missing comma or operator. > >> > >> The ChangeLog part of the commit message should follow the rules in > >> the GNU Coding Standards: > >> https://www.gnu.org/prep/standards/html_node/Style-of-Change-Logs.html > >> > >> Specifically, they should be wrapped to fit in an 80 column terminal > >> window. I think wrapping around 76 columns is common. Please add line > >> breaks here, e.g. > >> > >> * parser.cc (cp_parser_postfix_expression): Commit to the > >> parse in case we know its either a cast or invalid syntax. > >> (cp_parser_braced_list): Add a heuristic to inform about > >> missing comma or operator. > >> > >> (but with a leading TAB, not spaces). > > > > Agreed. In addition, we need DCO certification or copyright assignment > > (https://gcc.gnu.org/contribute.html#legal). > > > > Also, the patch itself was corrupted by word wrap in your mail client, > > so it doesn't apply, e.g.: > > > >> @@ -7881,8 +7881,13 @@ cp_parser_postfix_expression (cp_parser > >> *parser, bool address_p, bool cast_p, > > > > https://www.kernel.org/doc/html/latest/process/email-clients.html has > > some tips for avoiding word wrap, or you can just attach the patch > > instead of pasting it inline. > > > >> + /* This is just a heuristic. */ > > > > Two spaces after the . > > > >> + inform (finish_loc, + "probably missing a comma > >> or an operator before"); > > > > The string should line up after the ( on the previous line. > > > > We might as well also put this inform under the > > cp_parser_skip_to_closing_brace check; if there's no } at all, the > > problem isn't a missing comma... > > Also, error59 seems like an error-recovery regression: > > > +++ b/gcc/testsuite/g++.dg/parse/error59.C > > @@ -3,4 +3,4 @@ > > void foo() > > { > > (struct {}x){}; // { dg-error "" } > > -} > > +} // { dg-excess-errors "" } > > as we now get more of an error cascade. Perhaps also check the return > value of the earlier require_open and don't skip_to_closing_brace if it > failed? > > Jason > >
From 36b228ae1c8888ee84e8363fdf772f44521e1bd0 Mon Sep 17 00:00:00 2001 From: Franciszek Witt <franek.w...@gmail.com> Date: Tue, 20 Aug 2024 14:34:01 +0200 Subject: [PATCH v4] c++: Improve error messages related to parsing a postfix expression [PR101232] PR c++/101232 gcc/cp/ChangeLog: * parser.cc (cp_parser_postfix_expression): Commit to the parse in case we know its either a cast or invalid syntax. (cp_parser_braced_list): Add a heuristic to inform about missing comma or operator. gcc/testsuite/ChangeLog: * g++.dg/cpp0x/initlist-err1.C: New test. * g++.dg/cpp0x/initlist-err2.C: New test. * g++.dg/cpp0x/initlist-err3.C: New test. Signed-off-by: Franciszek Witt <franek.w...@gmail.com> --- gcc/cp/parser.cc | 23 +++++++++++++++++----- gcc/testsuite/g++.dg/cpp0x/initlist-err1.C | 11 +++++++++++ gcc/testsuite/g++.dg/cpp0x/initlist-err2.C | 11 +++++++++++ gcc/testsuite/g++.dg/cpp0x/initlist-err3.C | 11 +++++++++++ 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-err1.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-err2.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist-err3.C diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 1dd0efaf963..d7189c27b0d 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -7881,8 +7881,13 @@ cp_parser_postfix_expression (cp_parser *parser, bool address_p, bool cast_p, --parser->prevent_constrained_type_specifiers; /* Parse the cast itself. */ if (!cp_parser_error_occurred (parser)) - postfix_expression - = cp_parser_functional_cast (parser, type); + { + if (cp_lexer_next_token_is (parser->lexer, CPP_OPEN_BRACE)) + /* This can only be a cast. */ + cp_parser_commit_to_topmost_tentative_parse (parser); + postfix_expression + = cp_parser_functional_cast (parser, type); + } /* If that worked, we're done. */ if (cp_parser_parse_definitely (parser)) break; @@ -26332,7 +26337,7 @@ cp_parser_braced_list (cp_parser *parser, bool *non_constant_p /*=nullptr*/) /* Consume the `{' token. */ matching_braces braces; - braces.require_open (parser); + bool found_opening_brace = braces.require_open (parser); /* Create a CONSTRUCTOR to represent the braced-initializer. */ initializer = make_node (CONSTRUCTOR); /* If it's not a `}', then there is a non-trivial initializer. */ @@ -26350,8 +26355,16 @@ cp_parser_braced_list (cp_parser *parser, bool *non_constant_p /*=nullptr*/) else if (non_constant_p) *non_constant_p = false; /* Now, there should be a trailing `}'. */ - location_t finish_loc = cp_lexer_peek_token (parser->lexer)->location; - braces.require_close (parser); + cp_token * token = cp_lexer_peek_token (parser->lexer); + location_t finish_loc = token->location; + /* The part with CPP_SEMICOLON is just a heuristic. */ + if (!braces.require_close (parser) && token->type != CPP_SEMICOLON + && found_opening_brace && cp_parser_skip_to_closing_brace (parser)) + { + cp_lexer_consume_token (parser->lexer); + inform (finish_loc, + "probably missing a comma or an operator before"); + } TREE_TYPE (initializer) = init_list_type_node; recompute_constructor_flags (initializer); diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-err1.C b/gcc/testsuite/g++.dg/cpp0x/initlist-err1.C new file mode 100644 index 00000000000..6ea8afb3273 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-err1.C @@ -0,0 +1,11 @@ +// PR c++/101232 +// { dg-do compile { target c++11 } } + +struct X { + int a; + int b; +}; + +void f() { + auto x = X{ 1, 2; }; // { dg-error "21:" } +} // { dg-prune-output "expected declaration" } diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-err2.C b/gcc/testsuite/g++.dg/cpp0x/initlist-err2.C new file mode 100644 index 00000000000..227f519dc19 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-err2.C @@ -0,0 +1,11 @@ +// PR c++/101232 +// { dg-do compile { target c++11 } } + +struct X { + int a; + int b; +}; + +void f() { + auto x = X{ 1 2 }; // { dg-error "19:.*probably" } +} diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-err3.C b/gcc/testsuite/g++.dg/cpp0x/initlist-err3.C new file mode 100644 index 00000000000..b77ec9bf4e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist-err3.C @@ -0,0 +1,11 @@ +// PR c++/101232 +// { dg-do compile { target c++11 } } + +struct X { + int a; + int b; +}; + +void f() { + auto x = X{ 1, {2 }; // { dg-error "expected.*before" } +} -- 2.34.1