From: Kwok Cheung Yeung Date: Tue, 25 Jan 2022 19:40:58 +0000 (-0800) Subject: openmp: Metadirective fixes X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67310930e695f7b9a2ad2437386324fd74d8f1b0;p=thirdparty%2Fgcc.git 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.cc (c_parser_skip_to_end_of_block_or_statement): Track bracket depth separately from nesting depth. gcc/cp/ * parser.cc (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.cc (omp_dynamic_cond): Do not return user condition if constant. --- diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 369e8c9e5005..5a7891f02ecd 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,8 @@ +2022-01-25 Kwok Cheung Yeung + + * omp-general.cc (omp_dynamic_cond): Do not return user condition if + constant. + 2022-01-25 Kwok Cheung Yeung * omp-general.cc (omp_check_context_selector): Revert string length diff --git a/gcc/c/ChangeLog.omp b/gcc/c/ChangeLog.omp index 39f82752f9ee..103bf1585270 100644 --- a/gcc/c/ChangeLog.omp +++ b/gcc/c/ChangeLog.omp @@ -1,3 +1,8 @@ +2022-01-25 Kwok Cheung Yeung + + * c-parser.cc (c_parser_skip_to_end_of_block_or_statement): Track + bracket depth separately from nesting depth. + 2022-01-25 Kwok Cheung Yeung * c-parser.cc (c_parser_skip_to_end_of_block_or_statement): Handle diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index dd7338de51f7..d215ad62103f 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -1344,6 +1344,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) @@ -1366,7 +1367,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); @@ -1394,11 +1395,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 c1ef9a1651ed..31b988847492 100644 --- a/gcc/cp/ChangeLog.omp +++ b/gcc/cp/ChangeLog.omp @@ -1,3 +1,9 @@ +2022-01-25 Kwok Cheung Yeung + + * parser.cc (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.cc (cp_parser_skip_to_end_of_statement): Handle parentheses. diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 57df1e2fa809..ee838ea28f49 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -3931,17 +3931,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 @@ -3991,6 +3980,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) @@ -4012,7 +4002,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; @@ -4035,11 +4025,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.cc b/gcc/omp-general.cc index 19f67f817ae0..1e66cd7bce6a 100644 --- a/gcc/omp-general.cc +++ b/gcc/omp-general.cc @@ -2007,7 +2007,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) @@ -2018,8 +2018,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; }