From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1729) id 7CA75385DC35; Tue, 25 Jan 2022 20:36:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 7CA75385DC35 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Kwok Yeung To: gcc-cvs@gcc.gnu.org Subject: [gcc/devel/omp/gcc-11] openmp: Metadirective fixes X-Act-Checkin: gcc X-Git-Author: Kwok Cheung Yeung X-Git-Refname: refs/heads/devel/omp/gcc-11 X-Git-Oldrev: eb4bea483010d91fbeeae9c863e92da873fbeef9 X-Git-Newrev: b597c0835ede0067d1b009e0d7381515b44d8753 Message-Id: <20220125203652.7CA75385DC35@sourceware.org> Date: Tue, 25 Jan 2022 20:36:52 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Jan 2022 20:36:52 -0000 https://gcc.gnu.org/g:b597c0835ede0067d1b009e0d7381515b44d8753 commit b597c0835ede0067d1b009e0d7381515b44d8753 Author: Kwok Cheung Yeung Date: Tue Jan 25 11:40:58 2022 -0800 openmp: Metadirective fixes Fix regressions introduced by block/statement skipping. If user condition selector is constant, do not return it as a dynamic selector. 2022-01-25 Kwok Cheung Yeung gcc/c/ * c-parser.c (c_parser_skip_to_end_of_block_or_statement): Track bracket depth separately from nesting depth. gcc/cp/ * parser.c (cp_parser_skip_to_end_of_statement): Revert. (cp_parser_skip_to_end_of_block_or_statement): Track bracket depth separately from nesting depth. gcc/ * omp-general.c (omp_dynamic_cond): Do not return user condition if constant. Diff: --- gcc/ChangeLog.omp | 5 +++++ gcc/c/ChangeLog.omp | 5 +++++ gcc/c/c-parser.c | 9 ++++++--- gcc/cp/ChangeLog.omp | 6 ++++++ gcc/cp/parser.c | 20 ++++++-------------- gcc/omp-general.c | 8 ++++++-- 6 files changed, 34 insertions(+), 19 deletions(-) diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 47b8831e596..4c02ea1bb89 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,8 @@ +2022-01-25 Kwok Cheung Yeung + + * omp-general.c (omp_dynamic_cond): Do not return user condition if + constant. + 2022-01-25 Kwok Cheung Yeung * omp-general.c (omp_check_context_selector): Revert string length diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp index f691813801f..90b123fc0e6 100644 --- a/gcc/c/ChangeLog.omp +++ b/gcc/c/ChangeLog.omp @@ -1,3 +1,8 @@ +2022-01-25 Kwok Cheung Yeung + + * c-parser.c (c_parser_skip_to_end_of_block_or_statement): Track + bracket depth separately from nesting depth. + 2022-01-25 Kwok Cheung Yeung * c-parser.c (c_parser_skip_to_end_of_block_or_statement): Handle diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 747a4193c77..212c066cad3 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -1345,6 +1345,7 @@ static void c_parser_skip_to_end_of_block_or_statement (c_parser *parser) { unsigned nesting_depth = 0; + int bracket_depth = 0; bool save_error = parser->error; while (true) @@ -1367,7 +1368,7 @@ c_parser_skip_to_end_of_block_or_statement (c_parser *parser) case CPP_SEMICOLON: /* If the next token is a ';', we have reached the end of the statement. */ - if (!nesting_depth) + if (!nesting_depth && bracket_depth <= 0) { /* Consume the ';'. */ c_parser_consume_token (parser); @@ -1395,11 +1396,13 @@ c_parser_skip_to_end_of_block_or_statement (c_parser *parser) /* Track parentheses in case the statement is a standalone 'for' statement - we want to skip over the semicolons separating the operands. */ - nesting_depth++; + if (nesting_depth == 0) + ++bracket_depth; break; case CPP_CLOSE_PAREN: - nesting_depth--; + if (nesting_depth == 0) + --bracket_depth; break; case CPP_PRAGMA: diff --git a/gcc/cp/ChangeLog.omp b/gcc/cp/ChangeLog.omp index 5b44f265e8a..c226f07f9ae 100644 --- a/gcc/cp/ChangeLog.omp +++ b/gcc/cp/ChangeLog.omp @@ -1,3 +1,9 @@ +2022-01-25 Kwok Cheung Yeung + + * parser.c (cp_parser_skip_to_end_of_statement): Revert. + (cp_parser_skip_to_end_of_block_or_statement): Track bracket depth + separately from nesting depth. + 2022-01-25 Kwok Cheung Yeung * parser.c (cp_parser_skip_to_end_of_statement): Handle parentheses. diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 50f4ab2c2b6..c0950e06311 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -3897,17 +3897,6 @@ cp_parser_skip_to_end_of_statement (cp_parser* parser) ++nesting_depth; break; - case CPP_OPEN_PAREN: - /* Track parentheses in case the statement is a standalone 'for' - statement - we want to skip over the semicolons separating the - operands. */ - ++nesting_depth; - break; - - case CPP_CLOSE_PAREN: - --nesting_depth; - break; - case CPP_KEYWORD: if (token->keyword != RID__EXPORT && token->keyword != RID__MODULE @@ -3957,6 +3946,7 @@ static void cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser) { int nesting_depth = 0; + int bracket_depth = 0; /* Unwind generic function template scope if necessary. */ if (parser->fully_implicit_function_template_p) @@ -3978,7 +3968,7 @@ cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser) case CPP_SEMICOLON: /* Stop if this is an unnested ';'. */ - if (!nesting_depth) + if (!nesting_depth && bracket_depth <= 0) nesting_depth = -1; break; @@ -4001,11 +3991,13 @@ cp_parser_skip_to_end_of_block_or_statement (cp_parser* parser) /* Track parentheses in case the statement is a standalone 'for' statement - we want to skip over the semicolons separating the operands. */ - nesting_depth++; + if (nesting_depth == 0) + bracket_depth++; break; case CPP_CLOSE_PAREN: - nesting_depth--; + if (nesting_depth == 0) + bracket_depth--; break; case CPP_KEYWORD: diff --git a/gcc/omp-general.c b/gcc/omp-general.c index 6ad03e5b02f..36e1b1d21c3 100644 --- a/gcc/omp-general.c +++ b/gcc/omp-general.c @@ -1999,7 +1999,7 @@ omp_get_context_selector (tree ctx, const char *set, const char *sel) } /* Return a tree expression representing the dynamic part of the context - * selector CTX. */ + selector CTX. */ static tree omp_dynamic_cond (tree ctx) @@ -2010,8 +2010,12 @@ omp_dynamic_cond (tree ctx) tree expr_list = TREE_VALUE (user); gcc_assert (TREE_PURPOSE (expr_list) == NULL_TREE); - return TREE_VALUE (expr_list); + + /* The user condition is not dynamic if it is constant. */ + if (!tree_fits_shwi_p (TREE_VALUE (expr_list))) + return TREE_VALUE (expr_list); } + return NULL_TREE; }