From faa867f5a8b74b5eaef3066debc015dc888237cb Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sun, 2 Dec 2018 13:38:20 +0100 Subject: [PATCH] re PR c++/88258 (Infinite loop emitting diagnostics in the C++ front-end) PR c++/88258 * parser.c (cp_parser_skip_to_closing_parenthesis_1, cp_parser_skip_to_end_of_statement, cp_parser_skip_to_end_of_block_or_statement, cp_parser_skip_to_closing_brace, cp_parser_skip_to_closing_square_bracket, cp_parser_skip_balanced_tokens): Don't treat CPP_PRAGMA_EOL specially if in_pragma is false. * g++.dg/gomp/pr88258.C: New test. From-SVN: r266720 --- gcc/cp/ChangeLog | 11 +++++++++++ gcc/cp/parser.c | 30 +++++++++++++++++++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/gomp/pr88258.C | 11 +++++++++++ 4 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr88258.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 92238849903..02f08ab2641 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,14 @@ +2018-12-02 Jakub Jelinek + + PR c++/88258 + * parser.c (cp_parser_skip_to_closing_parenthesis_1, + cp_parser_skip_to_end_of_statement, + cp_parser_skip_to_end_of_block_or_statement, + cp_parser_skip_to_closing_brace, + cp_parser_skip_to_closing_square_bracket, + cp_parser_skip_balanced_tokens): Don't treat CPP_PRAGMA_EOL specially + if in_pragma is false. + 2018-12-01 Marek Polacek Implement P0634R3, Down with typename! diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index e271e87a707..ab6d2378622 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3558,8 +3558,11 @@ cp_parser_skip_to_closing_parenthesis_1 (cp_parser *parser, switch (token->type) { - case CPP_EOF: case CPP_PRAGMA_EOL: + if (!parser->lexer->in_pragma) + break; + /* FALLTHRU */ + case CPP_EOF: /* If we've run out of tokens, then there is no closing `)'. */ return 0; @@ -3654,8 +3657,11 @@ cp_parser_skip_to_end_of_statement (cp_parser* parser) switch (token->type) { - case CPP_EOF: case CPP_PRAGMA_EOL: + if (!parser->lexer->in_pragma) + break; + /* FALLTHRU */ + case CPP_EOF: /* If we've run out of tokens, stop. */ return; @@ -3744,8 +3750,11 @@ cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser) switch (token->type) { - case CPP_EOF: case CPP_PRAGMA_EOL: + if (!parser->lexer->in_pragma) + break; + /* FALLTHRU */ + case CPP_EOF: /* If we've run out of tokens, stop. */ return; @@ -3794,8 +3803,11 @@ cp_parser_skip_to_closing_brace (cp_parser *parser) switch (token->type) { - case CPP_EOF: case CPP_PRAGMA_EOL: + if (!parser->lexer->in_pragma) + break; + /* FALLTHRU */ + case CPP_EOF: /* If we've run out of tokens, stop. */ return false; @@ -22560,8 +22572,11 @@ cp_parser_skip_to_closing_square_bracket (cp_parser *parser) switch (token->type) { - case CPP_EOF: case CPP_PRAGMA_EOL: + if (!parser->lexer->in_pragma) + break; + /* FALLTHRU */ + case CPP_EOF: /* If we've run out of tokens, then there is no closing `]'. */ return false; @@ -26074,8 +26089,11 @@ cp_parser_skip_balanced_tokens (cp_parser *parser, size_t n) do switch (cp_lexer_peek_nth_token (parser->lexer, n++)->type) { - case CPP_EOF: case CPP_PRAGMA_EOL: + if (!parser->lexer->in_pragma) + break; + /* FALLTHRU */ + case CPP_EOF: /* Ran out of tokens. */ return orig_n; case CPP_OPEN_PAREN: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2cdbba498b7..92825b59b21 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-12-02 Jakub Jelinek + + PR c++/88258 + * g++.dg/gomp/pr88258.C: New test. + 2018-12-01 Marek Polacek Implement P0634R3, Down with typename! diff --git a/gcc/testsuite/g++.dg/gomp/pr88258.C b/gcc/testsuite/g++.dg/gomp/pr88258.C new file mode 100644 index 00000000000..9981bdbc00a --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr88258.C @@ -0,0 +1,11 @@ +// PR c++/88258 +// { dg-do compile } +// { dg-options "-fopenmp" } + +void +foo (bar int p) // { dg-error "variable or field|was not declared in this scope" } +{ + int i, x; + #pragma omp atomic write + x = 6; +} -- 2.30.2