diff options
author | Tobias Burnus <tobias@codesourcery.com> | 2020-07-21 18:29:53 +0200 |
---|---|---|
committer | Tobias Burnus <tobias@codesourcery.com> | 2020-07-22 09:57:15 +0200 |
commit | c7c24828cfa4983ebc6744be3f913d0da6ff7163 (patch) | |
tree | a8de602e795da9f5bac1ff2dcc94a1a4fd016876 /gcc/c/c-parser.c | |
parent | fb1de6a8543f4d7a63149bf99b54037315b8c3bb (diff) | |
download | gcc-c7c24828cfa4983ebc6744be3f913d0da6ff7163.zip gcc-c7c24828cfa4983ebc6744be3f913d0da6ff7163.tar.gz gcc-c7c24828cfa4983ebc6744be3f913d0da6ff7163.tar.bz2 |
OpenMP: Fixes for omp critical + hint
gcc/c-family/ChangeLog:
* c-omp.c (c_finish_omp_critical): Check for no name but
nonzero hint provided.
gcc/c/ChangeLog:
* c-parser.c (c_parser_omp_clause_hint): Require nonnegative hint clause.
(c_parser_omp_critical): Permit hint(0) clause without named critical.
(c_parser_omp_construct): Don't assert if error_mark_node is returned.
gcc/cp/ChangeLog:
* parser.c (cp_parser_omp_clause_hint): Require nonnegative hint.
(cp_parser_omp_critical): Permit hint(0) clause without named critical.
* pt.c (tsubst_expr): Re-check the latter for templates.
gcc/fortran/ChangeLog:
* openmp.c (gfc_match_omp_critical): Fix handling hints; permit
hint clause without named critical.
(resolve_omp_clauses): Require nonnegative constant integer
for the hint clause.
(gfc_resolve_omp_directive): Check for no name but
nonzero value for hint clause.
* parse.c (parse_omp_structured_block): Fix same-name check
for critical.
* trans-openmp.c (gfc_trans_omp_critical): Handle hint clause properly.
libgomp/ChangeLog:
* omp_lib.f90.in: Add omp_sync_hint_* and omp_sync_hint_kind.
* omp_lib.h.in: Likewise.
gcc/testsuite/ChangeLog:
* g++.dg/gomp/critical-3.C: Add nameless critical with hint testcase.
* c-c++-common/gomp/critical-hint-1.c: New test.
* c-c++-common/gomp/critical-hint-2.c: New test.
* gfortran.dg/gomp/critical-hint-1.f90: New test.
* gfortran.dg/gomp/critical-hint-2.f90: New test.
Diffstat (limited to 'gcc/c/c-parser.c')
-rw-r--r-- | gcc/c/c-parser.c | 26 |
1 files changed, 8 insertions, 18 deletions
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 275b8a3..7961cbc 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -13901,16 +13901,15 @@ c_parser_omp_clause_hint (c_parser *parser, tree list) expr = convert_lvalue_to_rvalue (expr_loc, expr, false, true); tree c, t = expr.value; t = c_fully_fold (t, false, NULL); - - parens.skip_until_found_close (parser); - if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) - || TREE_CODE (t) != INTEGER_CST) + || TREE_CODE (t) != INTEGER_CST + || tree_int_cst_sgn (t) == -1) { - c_parser_error (parser, "expected constant integer expression"); + c_parser_error (parser, "expected constant integer expression " + "with valid sync-hint value"); return list; } - + parens.skip_until_found_close (parser); check_no_duplicate_clause (list, OMP_CLAUSE_HINT, "hint"); c = build_omp_clause (hint_loc, OMP_CLAUSE_HINT); @@ -17795,18 +17794,9 @@ c_parser_omp_critical (location_t loc, c_parser *parser, bool *if_p) if (c_parser_next_token_is (parser, CPP_COMMA) && c_parser_peek_2nd_token (parser)->type == CPP_NAME) c_parser_consume_token (parser); - - clauses = c_parser_omp_all_clauses (parser, - OMP_CRITICAL_CLAUSE_MASK, - "#pragma omp critical"); } - else - { - if (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) - c_parser_error (parser, "expected %<(%> or end of line"); - c_parser_skip_to_pragma_eol (parser); - } - + clauses = c_parser_omp_all_clauses (parser, OMP_CRITICAL_CLAUSE_MASK, + "#pragma omp critical"); stmt = c_parser_omp_structured_block (parser, if_p); return c_finish_omp_critical (loc, stmt, name, clauses); } @@ -21537,7 +21527,7 @@ c_parser_omp_construct (c_parser *parser, bool *if_p) gcc_unreachable (); } - if (stmt) + if (stmt && stmt != error_mark_node) gcc_assert (EXPR_LOCATION (stmt) != UNKNOWN_LOCATION); } |