On Fri, 7 Feb 2020 at 14:54, Jason Merrill <ja...@redhat.com> wrote:
>
> Here we were swallowing all the syntax errors by parsing tentatively, and
> returning error_mark_node without ever actually giving an error.  Fixed by
> using save_tokens/rollback_tokens instead.
>
> Tested x86_64-pc-linux-gnu, applying to trunk.
>
>         PR c++/92517
>         * parser.c (cp_parser_constraint_primary_expression): Do the main
>         parse non-tentatively.
> ---
>  gcc/cp/parser.c                               | 17 +++++++----------
>  gcc/testsuite/g++.dg/cpp2a/concepts-syntax1.C |  9 +++++++++
>  2 files changed, 16 insertions(+), 10 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/cpp2a/concepts-syntax1.C
>

Hi,

This patch is causing several regressions on arm and aarch64.

For instance on aarch64:
FAIL: g++.dg/vect/pr89653.cc  -std=c++2a (test for excess errors)
Excess errors:
/aarch64-none-linux-gnu/libstdc++-v3/include/bits/ranges_algo.h:1254:4:
error: expected primary-expression before '&&' token

and on arm:
FAIL: g++.dg/cpp0x/lambda/lambda-pass.C  -std=c++2a (test for excess errors)
Excess errors:
/arm-none-linux-gnueabi/libstdc++-v3/include/bits/ranges_algo.h:1254:4:
error: expected primary-expression before '&&' token

Christophe

> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
> index e0f72302e5e..d4c9523289f 100644
> --- a/gcc/cp/parser.c
> +++ b/gcc/cp/parser.c
> @@ -27478,7 +27478,7 @@ cp_parser_constraint_primary_expression (cp_parser 
> *parser, bool lambda_p)
>        return e;
>      }
>
> -  cp_parser_parse_tentatively (parser);
> +  cp_lexer_save_tokens (parser->lexer);
>    cp_id_kind idk;
>    location_t loc = input_location;
>    cp_expr expr = cp_parser_primary_expression (parser,
> @@ -27494,19 +27494,16 @@ cp_parser_constraint_primary_expression (cp_parser 
> *parser, bool lambda_p)
>        /* The primary-expression could be part of an unenclosed non-logical
>          compound expression.  */
>        pce = cp_parser_constraint_requires_parens (parser, lambda_p);
> -      if (pce != pce_ok)
> -       cp_parser_simulate_error (parser);
> -      else
> -       expr = finish_constraint_primary_expr (expr);
>      }
> -  if (cp_parser_parse_definitely (parser))
> -    return expr;
> -  if (expr == error_mark_node)
> -    return error_mark_node;
> +  if (pce == pce_ok)
> +    {
> +      cp_lexer_commit_tokens (parser->lexer);
> +      return finish_constraint_primary_expr (expr);
> +    }
>
>    /* Retry the parse at a lower precedence. If that succeeds, diagnose the
>       error, but return the expression as if it were valid.  */
> -  gcc_assert (pce != pce_ok);
> +  cp_lexer_rollback_tokens (parser->lexer);
>    cp_parser_parse_tentatively (parser);
>    if (pce == pce_maybe_operator)
>      expr = cp_parser_assignment_expression (parser, NULL, false, false);
> diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-syntax1.C 
> b/gcc/testsuite/g++.dg/cpp2a/concepts-syntax1.C
> new file mode 100644
> index 00000000000..0a47682c456
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/cpp2a/concepts-syntax1.C
> @@ -0,0 +1,9 @@
> +// PR c++/92517
> +// { dg-do compile { target concepts } }
> +
> +template <typename T>
> +concept C = true;
> +
> +template<int I>
> +requires C decltype<I>         // { dg-error "" }
> +void f() {}
>
> base-commit: 3c7a03bc360c3511fae3747a71e579e9fd0824f9
> --
> 2.18.1
>

Reply via email to