https://gcc.gnu.org/g:4d6a43726148dbb2eff916de375af6003eacf8c9
commit r16-6250-g4d6a43726148dbb2eff916de375af6003eacf8c9 Author: Tobias Burnus <[email protected]> Date: Thu Dec 18 22:55:40 2025 +0100 OpenMP: Add no_openmp_constructs; improve Fortran clause parsing Add the assumption clause 'no_openmp_constructs' (which as most assumption clauses is ignored in the front end - for now). For Fortran, improve free-form parsing of argument-free clauses by avoiding substring matches. gcc/c/ChangeLog: * c-parser.cc (c_parser_omp_assumption_clauses): Add no_openmp_constructs clause. gcc/cp/ChangeLog: * parser.cc (cp_parser_omp_assumption_clauses): Add no_openmp_constructs clause. gcc/fortran/ChangeLog: * dump-parse-tree.cc (show_omp_assumes): Handle no_openmp_constructs clause. * gfortran.h (struct gfc_omp_assumptions): Add no_openmp_constructs. * openmp.cc (gfc_match_dupl_check): For free-form Fortran, avoid substring matching. (gfc_match_omp_clauses): Match no_openmp_constructs clause. Remove no longer needed 'needs_space', match 'order' followed by parenthesis instead of 'order' with parenthesis; reorder 'order' and 'ordering' clauses for free-form Fortran. (gfc_match_omp_assumes): Handle no_openmp_constructs clause. libgomp/ChangeLog: * libgomp.texi (OpenMP Implemenation Status): Mark no_openmp_constructs as implemented. gcc/testsuite/ChangeLog: * gfortran.dg/goacc/update-if_present-2.f90: Update dg-error. * gfortran.dg/gomp/order-8.f90: Likewise. * gfortran.dg/gomp/order-9.f90: Likewise. * c-c++-common/gomp/assume-5.c: New test. * gfortran.dg/gomp/assume-6.f90: New test. Diff: --- gcc/c/c-parser.cc | 17 ++- gcc/cp/parser.cc | 17 ++- gcc/fortran/dump-parse-tree.cc | 2 + gcc/fortran/gfortran.h | 3 +- gcc/fortran/openmp.cc | 130 ++++++++++----------- gcc/testsuite/c-c++-common/gomp/assume-5.c | 18 +++ .../gfortran.dg/goacc/update-if_present-2.f90 | 12 +- gcc/testsuite/gfortran.dg/gomp/assume-6.f90 | 8 ++ gcc/testsuite/gfortran.dg/gomp/order-8.f90 | 4 +- gcc/testsuite/gfortran.dg/gomp/order-9.f90 | 16 +-- libgomp/libgomp.texi | 2 +- 11 files changed, 138 insertions(+), 91 deletions(-) diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index d6d0b0ed4151..e39429afbb5c 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -30172,19 +30172,23 @@ c_parser_omp_error (c_parser *parser, enum pragma_context context) return false; } -/* Assumption clauses: - OpenMP 5.1 +/* Assumption clauses + OpenMP 5.1: absent (directive-name-list) contains (directive-name-list) holds (expression) no_openmp no_openmp_routines - no_parallelism */ + no_parallelism + + OpenMP 6.0: + no_openmp_constructs */ static void c_parser_omp_assumption_clauses (c_parser *parser, bool is_assume) { bool no_openmp = false; + bool no_openmp_constructs = false; bool no_openmp_routines = false; bool no_parallelism = false; bitmap_head absent_head, contains_head; @@ -30217,6 +30221,13 @@ c_parser_omp_assumption_clauses (c_parser *parser, bool is_assume) error_at (cloc, "too many %qs clauses", "no_openmp"); no_openmp = true; } + else if (!strcmp (p, "no_openmp_constructs")) + { + c_parser_consume_token (parser); + if (no_openmp_constructs) + error_at (cloc, "too many %qs clauses", "no_openmp_constructs"); + no_openmp_constructs = true; + } else if (!strcmp (p, "no_openmp_routines")) { c_parser_consume_token (parser); diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 521c05549f1e..284fd9a534bc 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -51959,20 +51959,24 @@ cp_parser_omp_context_selector_specification (cp_parser *parser, return nreverse (ret); } -/* Assumption clauses: - OpenMP 5.1 +/* Assumption clauses + OpenMP 5.1: absent (directive-name-list) contains (directive-name-list) holds (expression) no_openmp no_openmp_routines - no_parallelism */ + no_parallelism + + OpenMP 6.0: + no_openmp_constructs */ static void cp_parser_omp_assumption_clauses (cp_parser *parser, cp_token *pragma_tok, bool is_assume) { bool no_openmp = false; + bool no_openmp_constructs = false; bool no_openmp_routines = false; bool no_parallelism = false; bitmap_head absent_head, contains_head; @@ -52005,6 +52009,13 @@ cp_parser_omp_assumption_clauses (cp_parser *parser, cp_token *pragma_tok, error_at (cloc, "too many %qs clauses", "no_openmp"); no_openmp = true; } + else if (!strcmp (p, "no_openmp_constructs")) + { + cp_lexer_consume_token (parser->lexer); + if (no_openmp_constructs) + error_at (cloc, "too many %qs clauses", "no_openmp_constructs"); + no_openmp_constructs = true; + } else if (!strcmp (p, "no_openmp_routines")) { cp_lexer_consume_token (parser->lexer); diff --git a/gcc/fortran/dump-parse-tree.cc b/gcc/fortran/dump-parse-tree.cc index db6d54f5fc74..b081bbfc135a 100644 --- a/gcc/fortran/dump-parse-tree.cc +++ b/gcc/fortran/dump-parse-tree.cc @@ -1736,6 +1736,8 @@ show_omp_assumes (gfc_omp_assumptions *assume) } if (assume->no_openmp) fputs (" NO_OPENMP", dumpfile); + if (assume->no_openmp_constructs) + fputs (" NO_OPENMP_CONSTRUCTS", dumpfile); if (assume->no_openmp_routines) fputs (" NO_OPENMP_ROUTINES", dumpfile); if (assume->no_parallelism) diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 72aecfb83794..da007c9ca87f 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1631,7 +1631,8 @@ typedef struct gfc_omp_assumptions int n_absent, n_contains; enum gfc_statement *absent, *contains; gfc_expr_list *holds; - bool no_openmp:1, no_openmp_routines:1, no_parallelism:1; + bool no_openmp:1, no_openmp_routines:1, no_openmp_constructs:1; + bool no_parallelism:1; } gfc_omp_assumptions; diff --git a/gcc/fortran/openmp.cc b/gcc/fortran/openmp.cc index 4527068f9745..a7a76694c2c7 100644 --- a/gcc/fortran/openmp.cc +++ b/gcc/fortran/openmp.cc @@ -2313,9 +2313,18 @@ gfc_match_dupl_check (bool not_dupl, const char *name, bool open_parens = false, gfc_expr **expr = NULL, const char *dupl_msg = NULL) { match m; + char c; locus old_loc = gfc_current_locus; if ((m = gfc_match (name)) != MATCH_YES) return m; + /* Ensure that no partial string is matched. */ + if (gfc_current_form == FORM_FREE + && gfc_match_eos () != MATCH_YES + && ((c = gfc_peek_ascii_char ()) == '_' || ISALNUM (c))) + { + gfc_current_locus = old_loc; + return MATCH_NO; + } if (!not_dupl) { if (dupl_msg) @@ -2442,7 +2451,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->memorder = OMP_MEMORDER_ACQ_REL; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_MEMORDER) @@ -2453,7 +2461,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->memorder = OMP_MEMORDER_ACQUIRE; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_AFFINITY) @@ -2574,7 +2581,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, gfc_default_integer_kind, &gfc_current_locus); mpz_set_si (c->async_expr->value.integer, GOMP_ASYNC_NOVAL); - needs_space = true; } continue; } @@ -2585,7 +2591,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->par_auto = true; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_ATTACH) @@ -2625,7 +2630,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->capture = true; - needs_space = true; continue; } if (mask & OMP_CLAUSE_COLLAPSE) @@ -2657,7 +2661,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->compare = true; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_ASSUMPTIONS) @@ -3198,7 +3201,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->finalize = true; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_FIRSTPRIVATE) @@ -3215,7 +3217,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->full = needs_space = true; + c->full = true; continue; } break; @@ -3232,8 +3234,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, gfc_current_locus = old_loc; break; } - else if (m == MATCH_NO) - needs_space = true; continue; } if ((mask & OMP_CLAUSE_GRAINSIZE) @@ -3292,7 +3292,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->if_present = true; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_IF) @@ -3337,7 +3336,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->inbranch = needs_space = true; + c->inbranch = true; continue; } if ((mask & OMP_CLAUSE_INDEPENDENT) @@ -3347,7 +3346,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->independent = true; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_INDIRECT) @@ -3735,7 +3733,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->mergeable = needs_space = true; + c->mergeable = true; continue; } if ((mask & OMP_CLAUSE_MESSAGE) @@ -3754,39 +3752,51 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, OMP_MAP_IF_PRESENT, true, allow_derived)) continue; + if ((mask & OMP_CLAUSE_ASSUMPTIONS) + && (m = gfc_match_dupl_check (!c->assume + || !c->assume->no_openmp_constructs, + "no_openmp_constructs")) != MATCH_NO) + { + if (m == MATCH_ERROR) + goto error; + if (c->assume == NULL) + c->assume = gfc_get_omp_assumptions (); + c->assume->no_openmp_constructs = true; + continue; + } if ((mask & OMP_CLAUSE_ASSUMPTIONS) && (m = gfc_match_dupl_check (!c->assume || !c->assume->no_openmp_routines, - "no_openmp_routines")) == MATCH_YES) + "no_openmp_routines")) != MATCH_NO) { if (m == MATCH_ERROR) goto error; if (c->assume == NULL) c->assume = gfc_get_omp_assumptions (); - c->assume->no_openmp_routines = needs_space = true; + c->assume->no_openmp_routines = true; continue; } if ((mask & OMP_CLAUSE_ASSUMPTIONS) && (m = gfc_match_dupl_check (!c->assume || !c->assume->no_openmp, - "no_openmp")) == MATCH_YES) + "no_openmp")) != MATCH_NO) { if (m == MATCH_ERROR) goto error; if (c->assume == NULL) c->assume = gfc_get_omp_assumptions (); - c->assume->no_openmp = needs_space = true; + c->assume->no_openmp = true; continue; } if ((mask & OMP_CLAUSE_ASSUMPTIONS) && (m = gfc_match_dupl_check (!c->assume || !c->assume->no_parallelism, - "no_parallelism")) == MATCH_YES) + "no_parallelism")) != MATCH_NO) { if (m == MATCH_ERROR) goto error; if (c->assume == NULL) c->assume = gfc_get_omp_assumptions (); - c->assume->no_parallelism = needs_space = true; + c->assume->no_parallelism = true; continue; } @@ -3814,7 +3824,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->nogroup = needs_space = true; + c->nogroup = true; continue; } if ((mask & OMP_CLAUSE_NOHOST) @@ -3822,7 +3832,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->nohost = needs_space = true; + c->nohost = true; continue; } if ((mask & OMP_CLAUSE_NOTEMPORAL) @@ -3836,7 +3846,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->notinbranch = needs_space = true; + c->notinbranch = true; continue; } if ((mask & OMP_CLAUSE_NOWAIT) @@ -3844,7 +3854,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->nowait = needs_space = true; + c->nowait = true; continue; } if ((mask & OMP_CLAUSE_NUM_GANGS) @@ -3907,28 +3917,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, } break; case 'o': - if ((mask & OMP_CLAUSE_ORDER) - && (m = gfc_match_dupl_check (!c->order_concurrent, "order (")) - != MATCH_NO) - { - if (m == MATCH_ERROR) - goto error; - if (gfc_match (" reproducible : concurrent )") == MATCH_YES) - c->order_reproducible = true; - else if (gfc_match (" concurrent )") == MATCH_YES) - ; - else if (gfc_match (" unconstrained : concurrent )") == MATCH_YES) - c->order_unconstrained = true; - else - { - gfc_error ("Expected ORDER(CONCURRENT) at %C " - "with optional %<reproducible%> or " - "%<unconstrained%> modifier"); - goto error; - } - c->order_concurrent = true; - continue; - } if ((mask & OMP_CLAUSE_ORDERED) && (m = gfc_match_dupl_check (!c->ordered, "ordered")) != MATCH_NO) @@ -3955,7 +3943,28 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, continue; } - needs_space = true; + continue; + } + if ((mask & OMP_CLAUSE_ORDER) + && (m = gfc_match_dupl_check (!c->order_concurrent, "order", true)) + != MATCH_NO) + { + if (m == MATCH_ERROR) + goto error; + if (gfc_match (" reproducible : concurrent )") == MATCH_YES) + c->order_reproducible = true; + else if (gfc_match (" concurrent )") == MATCH_YES) + ; + else if (gfc_match (" unconstrained : concurrent )") == MATCH_YES) + c->order_unconstrained = true; + else + { + gfc_error ("Expected ORDER(CONCURRENT) at %C " + "with optional %<reproducible%> or " + "%<unconstrained%> modifier"); + goto error; + } + c->order_concurrent = true; continue; } break; @@ -4080,7 +4089,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->atomic_op = GFC_OMP_ATOMIC_READ; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_REDUCTION) @@ -4095,7 +4103,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->memorder = OMP_MEMORDER_RELAXED; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_MEMORDER) @@ -4106,7 +4113,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->memorder = OMP_MEMORDER_RELEASE; - needs_space = true; continue; } break; @@ -4200,11 +4206,8 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, break; } else if (m == MATCH_NO) - { - c->self_expr = gfc_get_logical_expr (gfc_default_logical_kind, - NULL, true); - needs_space = true; - } + c->self_expr = gfc_get_logical_expr (gfc_default_logical_kind, + NULL, true); continue; } if ((mask & OMP_CLAUSE_SELF) @@ -4220,7 +4223,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->seq = true; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_MEMORDER) @@ -4231,7 +4233,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->memorder = OMP_MEMORDER_SEQ_CST; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_SHARED) @@ -4252,7 +4253,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->simd = needs_space = true; + c->simd = true; continue; } if ((mask & OMP_CLAUSE_SEVERITY) @@ -4308,7 +4309,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->threads = needs_space = true; + c->threads = true; continue; } if ((mask & OMP_CLAUSE_TILE) @@ -4348,7 +4349,7 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, { if (m == MATCH_ERROR) goto error; - c->untied = needs_space = true; + c->untied = true; continue; } if ((mask & OMP_CLAUSE_ATOMIC) @@ -4359,7 +4360,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->atomic_op = GFC_OMP_ATOMIC_UPDATE; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_USE) @@ -4412,8 +4412,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, m = match_oacc_clause_gwv (c, GOMP_DIM_VECTOR); if (m == MATCH_ERROR) goto error; - if (m == MATCH_NO) - needs_space = true; continue; } break; @@ -4447,7 +4445,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->weak = true; - needs_space = true; continue; } if ((mask & OMP_CLAUSE_WORKER) @@ -4459,8 +4456,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, m = match_oacc_clause_gwv (c, GOMP_DIM_WORKER); if (m == MATCH_ERROR) goto error; - else if (m == MATCH_NO) - needs_space = true; continue; } if ((mask & OMP_CLAUSE_ATOMIC) @@ -4471,7 +4466,6 @@ gfc_match_omp_clauses (gfc_omp_clauses **cp, const omp_mask mask, if (m == MATCH_ERROR) goto error; c->atomic_op = GFC_OMP_ATOMIC_WRITE; - needs_space = true; continue; } break; @@ -5356,6 +5350,8 @@ gfc_match_omp_assumes (void) gfc_current_ns->omp_assumes->no_openmp |= c->assume->no_openmp; gfc_current_ns->omp_assumes->no_openmp_routines |= c->assume->no_openmp_routines; + gfc_current_ns->omp_assumes->no_openmp_constructs + |= c->assume->no_openmp_constructs; gfc_current_ns->omp_assumes->no_parallelism |= c->assume->no_parallelism; if (gfc_current_ns->omp_assumes->holds && c->assume->holds) { diff --git a/gcc/testsuite/c-c++-common/gomp/assume-5.c b/gcc/testsuite/c-c++-common/gomp/assume-5.c new file mode 100644 index 000000000000..6ffb0148fcc3 --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/assume-5.c @@ -0,0 +1,18 @@ +#pragma omp assumes no_openmp_constructs + +#pragma omp begin assumes no_openmp_constructs no_parallelism +void g(int x) +{ + if (x <= 0) + return; +} +#pragma omp end assumes + +void f() +{ + #pragma omp assume no_openmp no_openmp_something // { dg-error "32: expected assumption clause" } + ; + + #pragma omp assume no_openmp no_openmp_routines no_openmp_constructs no_openmp_constructs // { dg-error "72: too many 'no_openmp_constructs' clauses" } + ; +} diff --git a/gcc/testsuite/gfortran.dg/goacc/update-if_present-2.f90 b/gcc/testsuite/gfortran.dg/goacc/update-if_present-2.f90 index 052d2abe888b..41c2657b5360 100644 --- a/gcc/testsuite/gfortran.dg/goacc/update-if_present-2.f90 +++ b/gcc/testsuite/gfortran.dg/goacc/update-if_present-2.f90 @@ -12,10 +12,10 @@ subroutine t1 allocate (x, y, z(100)) - !$acc enter data copyin(a) if_present ! { dg-error "Expected '\\(' after 'if'" } - !$acc exit data copyout(a) if_present ! { dg-error "Expected '\\(' after 'if'" } + !$acc enter data copyin(a) if_present ! { dg-error "Failed to match clause" } + !$acc exit data copyout(a) if_present ! { dg-error "Failed to match clause" } - !$acc data copy(a) if_present ! { dg-error "Expected '\\(' after 'if'" } + !$acc data copy(a) if_present ! { dg-error "Failed to match clause" } !$acc end data ! { dg-error "Unexpected ..ACC END DATA statement" } !$acc declare link(a) if_present ! { dg-error "Unexpected junk after" } @@ -40,17 +40,17 @@ subroutine t2 end do !$acc end parallel - !$acc kernels loop if_present ! { dg-error "Expected '\\(' after 'if'" } + !$acc kernels loop if_present ! { dg-error "Failed to match clause" } do b = 1, 10 end do !$acc end kernels loop ! { dg-error "Unexpected ..ACC END KERNELS LOOP statement" } - !$acc parallel loop if_present ! { dg-error "Expected '\\(' after 'if'" } + !$acc parallel loop if_present ! { dg-error "Failed to match clause" } do b = 1, 10 end do !$acc end parallel loop ! { dg-error "Unexpected ..ACC END PARALLEL LOOP statement" } - !$acc serial loop if_present ! { dg-error "Expected '\\(' after 'if'" } + !$acc serial loop if_present ! { dg-error "Failed to match clause" } do b = 1, 10 end do !$acc end serial loop ! { dg-error "Unexpected ..ACC END SERIAL LOOP statement" } diff --git a/gcc/testsuite/gfortran.dg/gomp/assume-6.f90 b/gcc/testsuite/gfortran.dg/gomp/assume-6.f90 new file mode 100644 index 000000000000..80b746d64243 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/gomp/assume-6.f90 @@ -0,0 +1,8 @@ +!$omp assume no_openmp no_openmp_something ! { dg-error "24: Failed to match clause" } +block +end block + +!$omp assume no_openmp no_openmp_routines no_openmp_constructs no_openmp_constructs ! { dg-error "63: Duplicated 'no_openmp_constructs' clause" } +block +end block +end diff --git a/gcc/testsuite/gfortran.dg/gomp/order-8.f90 b/gcc/testsuite/gfortran.dg/gomp/order-8.f90 index 37b138b09cb5..5d01c89ac965 100644 --- a/gcc/testsuite/gfortran.dg/gomp/order-8.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/order-8.f90 @@ -2,11 +2,11 @@ subroutine f1 (a) integer :: a(*) integer i - !$omp do order ! { dg-error "Failed to match clause" } + !$omp do order ! { dg-error "Expected '\\(' after 'order'" } do i = 1, 128 a(i) = a(i) + 1 end do - !$omp do simd order : ! { dg-error "Failed to match clause" } + !$omp do simd order : ! { dg-error "Expected '\\(' after 'order'" } do i = 1, 128 a(i) = a(i) + 1 end do diff --git a/gcc/testsuite/gfortran.dg/gomp/order-9.f90 b/gcc/testsuite/gfortran.dg/gomp/order-9.f90 index c7695114cde2..0604a2632035 100644 --- a/gcc/testsuite/gfortran.dg/gomp/order-9.f90 +++ b/gcc/testsuite/gfortran.dg/gomp/order-9.f90 @@ -1,34 +1,34 @@ subroutine foo - !$omp do schedule(static) order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp do schedule(static) order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do - !$omp do schedule(static) order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp do schedule(static) order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do - !$omp loop bind(thread) order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp loop bind(thread) order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do - !$omp loop bind(thread) order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp loop bind(thread) order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do - !$omp simd order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp simd order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do - !$omp simd order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp simd order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do - !$omp distribute dist_schedule(static) order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp distribute dist_schedule(static) order(concurrent) order(concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do - !$omp loop bind(thread) order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order \\(' clause" } + !$omp loop bind(thread) order(reproducible:concurrent) order(unconstrained:concurrent) ! { dg-error "Duplicated 'order' clause" } do i = 1, 8 call f0 () end do diff --git a/libgomp/libgomp.texi b/libgomp/libgomp.texi index aabab4533f0f..621d5588fb0d 100644 --- a/libgomp/libgomp.texi +++ b/libgomp/libgomp.texi @@ -551,7 +551,7 @@ to address of matching mapped list item per 5.1, Sect. 2.21.7.2 @tab N @tab @item @code{message} and @code{severity} clauses to @code{parallel} directive @tab N @tab @item @code{self_maps} clause to @code{requires} directive @tab Y @tab -@item @code{no_openmp_constructs} assumptions clause @tab N @tab +@item @code{no_openmp_constructs} assumptions clause @tab Y @tab @item Restriction for @code{ordered} regarding loop-transforming directives @tab N @tab @item @code{apply} clause to loop-transforming constructs @tab N @tab
