From: Jakub Jelinek Date: Thu, 19 Aug 2021 08:38:19 +0000 (+0200) Subject: openmp: Fix ICE on requires clause with atomic_default_mem_order ( X-Git-Tag: basepoints/gcc-13~5297 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c04d766942274da89b236c4cb7e954b26da397c7;p=thirdparty%2Fgcc.git openmp: Fix ICE on requires clause with atomic_default_mem_order ( When working on error directive, I've noticed the C FE ICEs on #pragma omp requires atomic_default_mem_order ( where it tries to peek 2nd token after the CPP_PRAGMA_EOL (or CPP_EOF) in there in order to improve error-recovery on say atomic_default_mem_order (acquire) or atomic_default_mem_order (seqcst) etc. The C++ FE didn't ICE, but it is better to follow the same thing there. 2021-08-19 Jakub Jelinek gcc/c/ * c-parser.c (c_parser_omp_requires): Don't call c_parser_peek_2nd_token and optionally consume token if current token is CPP_EOF, CPP_PRAGMA_EOL or CPP_CLOSE_PAREN. gcc/cp/ * parser.c (cp_parser_omp_requires): Don't call cp_lexer_nth_token_is and optionally consume token if current token is CPP_EOF, CPP_PRAGMA_EOL or CPP_CLOSE_PAREN. gcc/testsuite/ * c-c++-common/gomp/requires-3.c: Add testcase for atomic_default_mem_order ( at the end of line without corresponding ). --- diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index d5f51b114231..407f279fc039 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -21710,9 +21710,18 @@ c_parser_omp_requires (c_parser *parser) error_at (c_parser_peek_token (parser)->location, "expected %, % or " "%"); - if (c_parser_peek_2nd_token (parser)->type - == CPP_CLOSE_PAREN) - c_parser_consume_token (parser); + switch (c_parser_peek_token (parser)->type) + { + case CPP_EOF: + case CPP_PRAGMA_EOL: + case CPP_CLOSE_PAREN: + break; + default: + if (c_parser_peek_2nd_token (parser)->type + == CPP_CLOSE_PAREN) + c_parser_consume_token (parser); + break; + } } else c_parser_consume_token (parser); diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 1d48b8333fef..0af1a2ccfbce 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -45479,9 +45479,18 @@ cp_parser_omp_requires (cp_parser *parser, cp_token *pragma_tok) error_at (cp_lexer_peek_token (parser->lexer)->location, "expected %, % or " "%"); - if (cp_lexer_nth_token_is (parser->lexer, 2, - CPP_CLOSE_PAREN)) - cp_lexer_consume_token (parser->lexer); + switch (cp_lexer_peek_token (parser->lexer)->type) + { + case CPP_EOF: + case CPP_PRAGMA_EOL: + case CPP_CLOSE_PAREN: + break; + default: + if (cp_lexer_nth_token_is (parser->lexer, 2, + CPP_CLOSE_PAREN)) + cp_lexer_consume_token (parser->lexer); + break; + } } else cp_lexer_consume_token (parser->lexer); diff --git a/gcc/testsuite/c-c++-common/gomp/requires-3.c b/gcc/testsuite/c-c++-common/gomp/requires-3.c index e5a6cbbdd2a6..0e55b666ebf7 100644 --- a/gcc/testsuite/c-c++-common/gomp/requires-3.c +++ b/gcc/testsuite/c-c++-common/gomp/requires-3.c @@ -1,3 +1,5 @@ #pragma omp requires atomic_default_mem_order(acquire) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ #pragma omp requires atomic_default_mem_order(release) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ #pragma omp requires atomic_default_mem_order(foobar) /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ +#pragma omp requires atomic_default_mem_order ( /* { dg-error "expected 'seq_cst', 'relaxed' or 'acq_rel'" } */ +/* { dg-error "expected '\\\)' before end of line" "" { target *-*-* } .-1 } */