From a43981bb51fd0b8e68452faea6ec160cbea058e5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 16 Apr 2020 07:19:57 +0200 Subject: [PATCH] c++: Fix pasto in structured binding diagnostics [PR94571] This snippet has been copied from the non-structured binding declaration parsing later in the function, and while for non-structured bindings it can be followed by comma or semicolon, structured bindings may be only followed by semicolon. Or, do we want to have a different message for the case when there is a comma (and keep this corrected one only if there is something else) that would explain better what is the bug (or add a fix-it hint)? Marek said in the PR that clang++ reports error: decomposition declaration must be the only declaration in its group There is another thing Marek noted (though, something for different spot), that diagnostic for auto x(1), [e,f] = test2; could also use a clearer wording like the above (or a fix-it hint), but the question is if we should assume [ after , as a structured binding or if we should do some tentative parsing first to figure out if it looks like a structured binding. 2020-04-16 Jakub Jelinek PR c++/94571 * parser.c (cp_parser_simple_declaration): Fix up a pasto in diagnostics. * g++.dg/cpp1z/decomp51.C: New test. (cherry picked from commit e4658c7dbbe88f742c96e5f58ee4a6d549d642ca) --- gcc/cp/parser.c | 2 +- gcc/testsuite/g++.dg/cpp1z/decomp51.C | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp1z/decomp51.C diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index db0276eb04fb..aa64549698fd 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13495,7 +13495,7 @@ cp_parser_simple_declaration (cp_parser* parser, if ((decl != error_mark_node && DECL_INITIAL (decl) != error_mark_node) || cp_parser_uncommitted_to_tentative_parse_p (parser)) - cp_parser_error (parser, "expected %<,%> or %<;%>"); + cp_parser_error (parser, "expected %<;%>"); /* Skip tokens until we reach the end of the statement. */ cp_parser_skip_to_end_of_statement (parser); /* If the next token is now a `;', consume it. */ diff --git a/gcc/testsuite/g++.dg/cpp1z/decomp51.C b/gcc/testsuite/g++.dg/cpp1z/decomp51.C new file mode 100644 index 000000000000..fe8b998abc89 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/decomp51.C @@ -0,0 +1,16 @@ +// PR c++/94571 +// { dg-do compile { target c++17 } } + +void +foo () +{ + int e[2], f[2]; + auto [a,b] = e, [c,d] = f; // { dg-error "expected ';' before ',' token" } +} + +void +bar () +{ + int e[2]; + auto [a, b] = e ); // { dg-error "expected ';' before '\\\)' token" } +} -- 2.47.2