Hi! I've committed following patch, after reading through all the OpenMP 4.5 region/construct nesting rules. Bootstrapped/regtested on x86_64-linux and i686-linux.
2015-11-06 Jakub Jelinek <ja...@redhat.com> * gimplify.c (gimplify_omp_ordered): Fix up diagnostics wording. * omp-low.c (check_omp_nesting_restrictions): Update for the various new OpenMP 4.5 nesting restrictions, clarified nesting glossary, closely nested region relationship clarified to mean explicit or implicit parallel regions (target/teams), use %</%> or %qs where appropriate. * gcc.dg/gomp/ordered-2.c (f1): Expect an extra error. * g++.dg/gomp/ordered-2.C (f1): Likewise. * gfortran.dg/goacc/parallel-kernels-regions.f95: Adjust expected diagnostics for the addition of quotes. * gfortran.dg/gomp/target3.f90: Likewise. * c-c++-common/goacc/nesting-fail-1.c: Likewise. * c-c++-common/goacc-gomp/nesting-fail-1.c: Likewise. * c-c++-common/gomp/doacross-1.c: Likewise. * c-c++-common/gomp/nesting-warn-1.c: Likewise. * c-c++-common/gomp/cancel-1.c (f2): Add some new tests. Adjust expected diagnostics wording. * c-c++-common/gomp/clauses-4.c (foo): Likewise. Don't expect error on ordered threads simd when in for simd. * c-c++-common/gomp/nesting-2.c: New test. * c-c++-common/gomp/ordered-3.c (foo): Add some new tests. * c-c++-common/gomp/ordered-4.c: New test. --- gcc/gimplify.c.jj 2015-11-06 08:08:07.000000000 +0100 +++ gcc/gimplify.c 2015-11-06 16:22:43.060530122 +0100 @@ -9259,9 +9259,9 @@ gimplify_omp_ordered (tree expr, gimple_ || OMP_CLAUSE_DEPEND_KIND (c) == OMP_CLAUSE_DEPEND_SOURCE)) { error_at (OMP_CLAUSE_LOCATION (c), - "%<depend%> clause must be closely nested " - "inside a loop with %<ordered%> clause with " - "a parameter"); + "%<ordered%> construct with %<depend%> clause must be " + "closely nested inside a loop with %<ordered%> clause " + "with a parameter"); failures++; } else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND --- gcc/omp-low.c.jj 2015-11-06 08:07:57.000000000 +0100 +++ gcc/omp-low.c 2015-11-06 19:04:33.233408901 +0100 @@ -3112,9 +3112,9 @@ check_omp_nesting_restrictions (gimple * if (!(is_gimple_omp (stmt) && is_gimple_omp_oacc (stmt))) { - for (omp_context *ctx_ = ctx; ctx_ != NULL; ctx_ = ctx_->outer) - if (is_gimple_omp (ctx_->stmt) - && is_gimple_omp_oacc (ctx_->stmt) + for (omp_context *octx = ctx; octx != NULL; octx = octx->outer) + if (is_gimple_omp (octx->stmt) + && is_gimple_omp_oacc (octx->stmt) /* Except for atomic codes that we share with OpenMP. */ && ! (gimple_code (stmt) == GIMPLE_OMP_ATOMIC_LOAD || gimple_code (stmt) == GIMPLE_OMP_ATOMIC_STORE)) @@ -3134,12 +3134,27 @@ check_omp_nesting_restrictions (gimple * if (gimple_code (stmt) == GIMPLE_OMP_ORDERED) { c = gimple_omp_ordered_clauses (as_a <gomp_ordered *> (stmt)); - if (c && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SIMD) - return true; + if (find_omp_clause (c, OMP_CLAUSE_SIMD)) + { + if (find_omp_clause (c, OMP_CLAUSE_THREADS) + && (ctx->outer == NULL + || !gimple_omp_for_combined_into_p (ctx->stmt) + || gimple_code (ctx->outer->stmt) != GIMPLE_OMP_FOR + || (gimple_omp_for_kind (ctx->outer->stmt) + != GF_OMP_FOR_KIND_FOR) + || !gimple_omp_for_combined_p (ctx->outer->stmt))) + { + error_at (gimple_location (stmt), + "%<ordered simd threads%> must be closely " + "nested inside of %<for simd%> region"); + return false; + } + return true; + } } error_at (gimple_location (stmt), "OpenMP constructs other than %<#pragma omp ordered simd%>" - " may not be nested inside simd region"); + " may not be nested inside %<simd%> region"); return false; } else if (gimple_code (ctx->stmt) == GIMPLE_OMP_TEAMS) @@ -3150,8 +3165,9 @@ check_omp_nesting_restrictions (gimple * && gimple_code (stmt) != GIMPLE_OMP_PARALLEL) { error_at (gimple_location (stmt), - "only distribute or parallel constructs are allowed to " - "be closely nested inside teams construct"); + "only %<distribute%> or %<parallel%> regions are " + "allowed to be strictly nested inside %<teams%> " + "region"); return false; } } @@ -3166,8 +3182,8 @@ check_omp_nesting_restrictions (gimple * if (ctx != NULL && gimple_code (ctx->stmt) != GIMPLE_OMP_TEAMS) { error_at (gimple_location (stmt), - "distribute construct must be closely nested inside " - "teams construct"); + "%<distribute%> region must be strictly nested " + "inside %<teams%> construct"); return false; } return true; @@ -3222,13 +3238,15 @@ check_omp_nesting_restrictions (gimple * { const char *bad = NULL; const char *kind = NULL; + const char *construct + = (DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)) + == BUILT_IN_GOMP_CANCEL) + ? "#pragma omp cancel" + : "#pragma omp cancellation point"; if (ctx == NULL) { error_at (gimple_location (stmt), "orphaned %qs construct", - DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)) - == BUILT_IN_GOMP_CANCEL - ? "#pragma omp cancel" - : "#pragma omp cancellation point"); + construct); return false; } switch (tree_fits_shwi_p (gimple_call_arg (stmt, 0)) @@ -3304,7 +3322,33 @@ check_omp_nesting_restrictions (gimple * if (gimple_code (ctx->stmt) != GIMPLE_OMP_TASK) bad = "#pragma omp task"; else - ctx->cancellable = true; + { + for (omp_context *octx = ctx->outer; + octx; octx = octx->outer) + { + switch (gimple_code (octx->stmt)) + { + case GIMPLE_OMP_TASKGROUP: + break; + case GIMPLE_OMP_TARGET: + if (gimple_omp_target_kind (octx->stmt) + != GF_OMP_TARGET_KIND_REGION) + continue; + /* FALLTHRU */ + case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TEAMS: + error_at (gimple_location (stmt), + "%<%s taskgroup%> construct not closely " + "nested inside of %<taskgroup%> region", + construct); + return false; + default: + continue; + } + break; + } + ctx->cancellable = true; + } kind = "taskgroup"; break; default: @@ -3315,10 +3359,7 @@ check_omp_nesting_restrictions (gimple * { error_at (gimple_location (stmt), "%<%s %s%> construct not closely nested inside of %qs", - DECL_FUNCTION_CODE (gimple_call_fndecl (stmt)) - == BUILT_IN_GOMP_CANCEL - ? "#pragma omp cancel" - : "#pragma omp cancellation point", kind, bad); + construct, kind, bad); return false; } } @@ -3329,6 +3370,10 @@ check_omp_nesting_restrictions (gimple * switch (gimple_code (ctx->stmt)) { case GIMPLE_OMP_FOR: + if (gimple_omp_for_kind (ctx->stmt) != GF_OMP_FOR_KIND_FOR + && gimple_omp_for_kind (ctx->stmt) != GF_OMP_FOR_KIND_TASKLOOP) + break; + /* FALLTHRU */ case GIMPLE_OMP_SECTIONS: case GIMPLE_OMP_SINGLE: case GIMPLE_OMP_ORDERED: @@ -3342,17 +3387,24 @@ check_omp_nesting_restrictions (gimple * return true; error_at (gimple_location (stmt), "barrier region may not be closely nested inside " - "of work-sharing, critical, ordered, master or " - "explicit task region"); + "of work-sharing, %<critical%>, %<ordered%>, " + "%<master%>, explicit %<task%> or %<taskloop%> " + "region"); return false; } error_at (gimple_location (stmt), "work-sharing region may not be closely nested inside " - "of work-sharing, critical, ordered, master or explicit " - "task region"); + "of work-sharing, %<critical%>, %<ordered%>, " + "%<master%>, explicit %<task%> or %<taskloop%> region"); return false; case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TEAMS: return true; + case GIMPLE_OMP_TARGET: + if (gimple_omp_target_kind (ctx->stmt) + == GF_OMP_TARGET_KIND_REGION) + return true; + break; default: break; } @@ -3362,15 +3414,26 @@ check_omp_nesting_restrictions (gimple * switch (gimple_code (ctx->stmt)) { case GIMPLE_OMP_FOR: + if (gimple_omp_for_kind (ctx->stmt) != GF_OMP_FOR_KIND_FOR + && gimple_omp_for_kind (ctx->stmt) != GF_OMP_FOR_KIND_TASKLOOP) + break; + /* FALLTHRU */ case GIMPLE_OMP_SECTIONS: case GIMPLE_OMP_SINGLE: case GIMPLE_OMP_TASK: error_at (gimple_location (stmt), - "master region may not be closely nested inside " - "of work-sharing or explicit task region"); + "%<master%> region may not be closely nested inside " + "of work-sharing, explicit %<task%> or %<taskloop%> " + "region"); return false; case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TEAMS: return true; + case GIMPLE_OMP_TARGET: + if (gimple_omp_target_kind (ctx->stmt) + == GF_OMP_TARGET_KIND_REGION) + return true; + break; default: break; } @@ -3395,8 +3458,7 @@ check_omp_nesting_restrictions (gimple * if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND) { gcc_assert (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_THREADS - || (ctx == NULL - && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SIMD)); + || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SIMD); continue; } enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_KIND (c); @@ -3412,23 +3474,40 @@ check_omp_nesting_restrictions (gimple * OMP_CLAUSE_ORDERED)) == NULL_TREE) { error_at (OMP_CLAUSE_LOCATION (c), - "%<depend%> clause must be closely nested " - "inside an ordered loop"); + "%<ordered%> construct with %<depend%> clause " + "must be closely nested inside an %<ordered%> " + "loop"); return false; } else if (OMP_CLAUSE_ORDERED_EXPR (oclause) == NULL_TREE) { error_at (OMP_CLAUSE_LOCATION (c), - "%<depend%> clause must be closely nested " - "inside a loop with %<ordered%> clause with " - "a parameter"); + "%<ordered%> construct with %<depend%> clause " + "must be closely nested inside a loop with " + "%<ordered%> clause with a parameter"); return false; } } else { error_at (OMP_CLAUSE_LOCATION (c), - "invalid depend kind in omp ordered depend"); + "invalid depend kind in omp %<ordered%> %<depend%>"); + return false; + } + } + c = gimple_omp_ordered_clauses (as_a <gomp_ordered *> (stmt)); + if (find_omp_clause (c, OMP_CLAUSE_SIMD)) + { + /* ordered simd must be closely nested inside of simd region, + and simd region must not encounter constructs other than + ordered simd, therefore ordered simd may be either orphaned, + or ctx->stmt must be simd. The latter case is handled already + earlier. */ + if (ctx != NULL) + { + error_at (gimple_location (stmt), + "%<ordered%> %<simd%> must be closely nested inside " + "%<simd%> region"); return false; } } @@ -3437,24 +3516,35 @@ check_omp_nesting_restrictions (gimple * { case GIMPLE_OMP_CRITICAL: case GIMPLE_OMP_TASK: + case GIMPLE_OMP_ORDERED: + ordered_in_taskloop: error_at (gimple_location (stmt), - "ordered region may not be closely nested inside " - "of critical or explicit task region"); + "%<ordered%> region may not be closely nested inside " + "of %<critical%>, %<ordered%>, explicit %<task%> or " + "%<taskloop%> region"); return false; case GIMPLE_OMP_FOR: + if (gimple_omp_for_kind (ctx->stmt) == GF_OMP_FOR_KIND_TASKLOOP) + goto ordered_in_taskloop; if (find_omp_clause (gimple_omp_for_clauses (ctx->stmt), OMP_CLAUSE_ORDERED) == NULL) { error_at (gimple_location (stmt), - "ordered region must be closely nested inside " - "a loop region with an ordered clause"); + "%<ordered%> region must be closely nested inside " + "a loop region with an %<ordered%> clause"); return false; } return true; + case GIMPLE_OMP_TARGET: + if (gimple_omp_target_kind (ctx->stmt) + != GF_OMP_TARGET_KIND_REGION) + break; + /* FALLTHRU */ case GIMPLE_OMP_PARALLEL: + case GIMPLE_OMP_TEAMS: error_at (gimple_location (stmt), - "ordered region must be closely nested inside " - "a loop region with an ordered clause"); + "%<ordered%> region must be closely nested inside " + "a loop region with an %<ordered%> clause"); return false; default: break; @@ -3470,8 +3560,8 @@ check_omp_nesting_restrictions (gimple * if (this_stmt_name == gimple_omp_critical_name (other_crit)) { error_at (gimple_location (stmt), - "critical region may not be nested inside a critical " - "region with the same name"); + "%<critical%> region may not be nested inside " + "a %<critical%> region with the same name"); return false; } } @@ -3482,8 +3572,8 @@ check_omp_nesting_restrictions (gimple * || gimple_omp_target_kind (ctx->stmt) != GF_OMP_TARGET_KIND_REGION) { error_at (gimple_location (stmt), - "teams construct not closely nested inside of target " - "region"); + "%<teams%> construct not closely nested inside of " + "%<target%> construct"); return false; } break; @@ -3549,7 +3639,7 @@ check_omp_nesting_restrictions (gimple * != is_gimple_omp_oacc (ctx->stmt)) { error_at (gimple_location (stmt), - "%s %s construct inside of %s %s region", + "%s %qs construct inside of %s %qs region", (is_gimple_omp_oacc (stmt) ? "OpenACC" : "OpenMP"), stmt_name, (is_gimple_omp_oacc (ctx->stmt) @@ -3562,15 +3652,14 @@ check_omp_nesting_restrictions (gimple * if (is_gimple_omp_oacc (ctx->stmt)) { error_at (gimple_location (stmt), - "%s construct inside of %s region", + "%qs construct inside of %qs region", stmt_name, ctx_stmt_name); return false; } else { - gcc_checking_assert (!is_gimple_omp_oacc (stmt)); warning_at (gimple_location (stmt), 0, - "%s construct inside of %s region", + "%qs construct inside of %qs region", stmt_name, ctx_stmt_name); } } --- gcc/testsuite/gcc.dg/gomp/ordered-2.c.jj 2015-10-14 10:25:21.000000000 +0200 +++ gcc/testsuite/gcc.dg/gomp/ordered-2.c 2015-11-06 17:35:11.992932617 +0100 @@ -3,5 +3,5 @@ void f1(void) { #pragma omp ordered asdf /* { dg-error "expected" } */ - #pragma omp ordered + #pragma omp ordered /* { dg-error "region may not be closely nested inside of" } */ } /* { dg-error "expected expression" } */ --- gcc/testsuite/g++.dg/gomp/ordered-2.C.jj 2015-10-14 10:25:28.000000000 +0200 +++ gcc/testsuite/g++.dg/gomp/ordered-2.C 2015-11-06 18:17:53.872783499 +0100 @@ -3,5 +3,5 @@ void f1(void) { #pragma omp ordered asdf /* { dg-error "expected" } */ - #pragma omp ordered + #pragma omp ordered /* { dg-error "region may not be closely nested inside of" } */ } /* { dg-error "expected" } */ --- gcc/testsuite/gfortran.dg/goacc/parallel-kernels-regions.f95.jj 2015-10-14 10:25:11.000000000 +0200 +++ gcc/testsuite/gfortran.dg/goacc/parallel-kernels-regions.f95 2015-11-06 18:20:02.174999978 +0100 @@ -9,46 +9,46 @@ program test integer :: i !$acc parallel - !$acc kernels ! { dg-bogus "kernels construct inside of parallel region" "not implemented" { xfail *-*-* } } + !$acc kernels ! { dg-bogus ".kernels. construct inside of .parallel. region" "not implemented" { xfail *-*-* } } !$acc end kernels !$acc end parallel !$acc parallel - !$acc parallel ! { dg-bogus "parallel construct inside of parallel region" "not implemented" { xfail *-*-* } } + !$acc parallel ! { dg-bogus ".parallel. construct inside of .parallel. region" "not implemented" { xfail *-*-* } } !$acc end parallel !$acc end parallel !$acc parallel - !$acc parallel ! { dg-bogus "parallel construct inside of parallel region" "not implemented" { xfail *-*-* } } + !$acc parallel ! { dg-bogus ".parallel. construct inside of .parallel. region" "not implemented" { xfail *-*-* } } !$acc end parallel - !$acc kernels ! { dg-bogus "kernels construct inside of parallel region" "not implemented" { xfail *-*-* } } + !$acc kernels ! { dg-bogus ".kernels. construct inside of .parallel. region" "not implemented" { xfail *-*-* } } !$acc end kernels !$acc end parallel !$acc kernels - !$acc kernels ! { dg-bogus "kernels construct inside of kernels region" "not implemented" { xfail *-*-* } } + !$acc kernels ! { dg-bogus ".kernels. construct inside of .kernels. region" "not implemented" { xfail *-*-* } } !$acc end kernels !$acc end kernels !$acc kernels - !$acc parallel ! { dg-bogus "parallel construct inside of kernels region" "not implemented" { xfail *-*-* } } + !$acc parallel ! { dg-bogus ".parallel. construct inside of .kernels. region" "not implemented" { xfail *-*-* } } !$acc end parallel !$acc end kernels !$acc kernels - !$acc parallel ! { dg-bogus "parallel construct inside of kernels region" "not implemented" { xfail *-*-* } } + !$acc parallel ! { dg-bogus ".parallel. construct inside of .kernels. region" "not implemented" { xfail *-*-* } } !$acc end parallel - !$acc kernels ! { dg-bogus "kernels construct inside of kernels region" "not implemented" { xfail *-*-* } } + !$acc kernels ! { dg-bogus ".kernels. construct inside of .kernels. region" "not implemented" { xfail *-*-* } } !$acc end kernels !$acc end kernels !$acc parallel - !$acc data ! { dg-error "data construct inside of parallel region" } + !$acc data ! { dg-error ".data. construct inside of .parallel. region" } !$acc end data !$acc end parallel !$acc kernels - !$acc data ! { dg-error "data construct inside of kernels region" } + !$acc data ! { dg-error ".data. construct inside of .kernels. region" } !$acc end data !$acc end kernels --- gcc/testsuite/gfortran.dg/gomp/target3.f90.jj 2015-10-14 10:25:11.000000000 +0200 +++ gcc/testsuite/gfortran.dg/gomp/target3.f90 2015-11-06 18:20:35.504536666 +0100 @@ -4,7 +4,7 @@ subroutine foo (r) integer :: i, r !$omp target - !$omp target teams distribute parallel do reduction (+: r) ! { dg-warning "target construct inside of target region" } + !$omp target teams distribute parallel do reduction (+: r) ! { dg-warning ".target. construct inside of .target. region" } do i = 1, 10 r = r + 1 end do --- gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c.jj 2015-10-14 10:25:30.000000000 +0200 +++ gcc/testsuite/c-c++-common/goacc/nesting-fail-1.c 2015-11-06 17:39:58.504882344 +0100 @@ -7,15 +7,15 @@ f_acc_parallel (void) { #pragma acc parallel { -#pragma acc parallel /* { dg-bogus "parallel construct inside of parallel region" "not implemented" { xfail *-*-* } } */ +#pragma acc parallel /* { dg-bogus ".parallel. construct inside of .parallel. region" "not implemented" { xfail *-*-* } } */ ; -#pragma acc kernels /* { dg-bogus "kernels construct inside of parallel region" "not implemented" { xfail *-*-* } } */ +#pragma acc kernels /* { dg-bogus ".kernels. construct inside of .parallel. region" "not implemented" { xfail *-*-* } } */ ; -#pragma acc data /* { dg-error "data construct inside of parallel region" } */ +#pragma acc data /* { dg-error ".data. construct inside of .parallel. region" } */ ; -#pragma acc update host(i) /* { dg-error "update construct inside of parallel region" } */ -#pragma acc enter data copyin(i) /* { dg-error "enter/exit data construct inside of parallel region" } */ -#pragma acc exit data delete(i) /* { dg-error "enter/exit data construct inside of parallel region" } */ +#pragma acc update host(i) /* { dg-error ".update. construct inside of .parallel. region" } */ +#pragma acc enter data copyin(i) /* { dg-error ".enter/exit data. construct inside of .parallel. region" } */ +#pragma acc exit data delete(i) /* { dg-error ".enter/exit data. construct inside of .parallel. region" } */ } } @@ -26,14 +26,14 @@ f_acc_kernels (void) { #pragma acc kernels { -#pragma acc parallel /* { dg-bogus "parallel construct inside of kernels region" "not implemented" { xfail *-*-* } } */ +#pragma acc parallel /* { dg-bogus ".parallel. construct inside of .kernels. region" "not implemented" { xfail *-*-* } } */ ; -#pragma acc kernels /* { dg-bogus "kernels construct inside of kernels region" "not implemented" { xfail *-*-* } } */ +#pragma acc kernels /* { dg-bogus ".kernels. construct inside of .kernels. region" "not implemented" { xfail *-*-* } } */ ; -#pragma acc data /* { dg-error "data construct inside of kernels region" } */ +#pragma acc data /* { dg-error ".data. construct inside of .kernels. region" } */ ; -#pragma acc update host(i) /* { dg-error "update construct inside of kernels region" } */ -#pragma acc enter data copyin(i) /* { dg-error "enter/exit data construct inside of kernels region" } */ -#pragma acc exit data delete(i) /* { dg-error "enter/exit data construct inside of kernels region" } */ +#pragma acc update host(i) /* { dg-error ".update. construct inside of .kernels. region" } */ +#pragma acc enter data copyin(i) /* { dg-error ".enter/exit data. construct inside of .kernels. region" } */ +#pragma acc exit data delete(i) /* { dg-error ".enter/exit data. construct inside of .kernels. region" } */ } } --- gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c.jj 2015-11-05 11:39:52.000000000 +0100 +++ gcc/testsuite/c-c++-common/goacc-gomp/nesting-fail-1.c 2015-11-06 21:14:46.000000000 +0100 @@ -151,15 +151,15 @@ f_omp (void) #pragma omp target { -#pragma acc parallel /* { dg-error "OpenACC parallel construct inside of OpenMP target region" } */ +#pragma acc parallel /* { dg-error "OpenACC .parallel. construct inside of OpenMP .target. region" } */ ; -#pragma acc kernels /* { dg-error "OpenACC kernels construct inside of OpenMP target region" } */ +#pragma acc kernels /* { dg-error "OpenACC .kernels. construct inside of OpenMP .target. region" } */ ; -#pragma acc data /* { dg-error "OpenACC data construct inside of OpenMP target region" } */ +#pragma acc data /* { dg-error "OpenACC .data. construct inside of OpenMP .target. region" } */ ; -#pragma acc update host(i) /* { dg-error "OpenACC update construct inside of OpenMP target region" } */ -#pragma acc enter data copyin(i) /* { dg-error "OpenACC enter/exit data construct inside of OpenMP target region" } */ -#pragma acc exit data delete(i) /* { dg-error "OpenACC enter/exit data construct inside of OpenMP target region" } */ +#pragma acc update host(i) /* { dg-error "OpenACC .update. construct inside of OpenMP .target. region" } */ +#pragma acc enter data copyin(i) /* { dg-error "OpenACC .enter/exit data. construct inside of OpenMP .target. region" } */ +#pragma acc exit data delete(i) /* { dg-error "OpenACC .enter/exit data. construct inside of OpenMP .target. region" } */ #pragma acc loop /* { dg-error "loop directive must be associated with an OpenACC compute region" } */ for (i = 0; i < 2; ++i) ; --- gcc/testsuite/c-c++-common/gomp/cancel-1.c.jj 2015-10-14 10:25:30.000000000 +0200 +++ gcc/testsuite/c-c++-common/gomp/cancel-1.c 2015-11-06 18:30:44.544959750 +0100 @@ -77,12 +77,73 @@ f2 (void) #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ #pragma omp cancel for /* { dg-error "not closely nested inside" } */ #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ + #pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + } + #pragma omp taskgroup + #pragma omp task + { + #pragma omp cancel parallel /* { dg-error "not closely nested inside" } */ + #pragma omp cancel for /* { dg-error "not closely nested inside" } */ + #pragma omp cancel sections /* { dg-error "not closely nested inside" } */ #pragma omp cancel taskgroup #pragma omp cancellation point parallel /* { dg-error "not closely nested inside" } */ #pragma omp cancellation point for /* { dg-error "not closely nested inside" } */ #pragma omp cancellation point sections /* { dg-error "not closely nested inside" } */ #pragma omp cancellation point taskgroup } + #pragma omp taskgroup + { + #pragma omp task + { + #pragma omp task + { + #pragma omp cancellation point taskgroup + #pragma omp cancel taskgroup + } + } + } + #pragma omp taskgroup + { + #pragma omp parallel + { + #pragma omp task + { + #pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + #pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + } + } + #pragma omp target + { + #pragma omp task + { + #pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + #pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + } + } + #pragma omp target + #pragma omp teams + #pragma omp distribute + for (i = 0; i < 10; i++) + { + #pragma omp task + { + #pragma omp cancel taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + #pragma omp cancellation point taskgroup /* { dg-error "construct not closely nested inside of .taskgroup. region" } */ + } + } + #pragma omp target data map(i) + { + #pragma omp task + { + #pragma omp cancel taskgroup + #pragma omp cancellation point taskgroup + } + } + } #pragma omp for for (i = 0; i < 10; i++) { @@ -179,14 +240,14 @@ f2 (void) } #pragma omp target teams { - #pragma omp cancel parallel /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ - #pragma omp cancel for /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ - #pragma omp cancel sections /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ - #pragma omp cancel taskgroup /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ - #pragma omp cancellation point parallel /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ - #pragma omp cancellation point for /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ - #pragma omp cancellation point sections /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ - #pragma omp cancellation point taskgroup /* { dg-error "only distribute or parallel constructs are allowed to be closely nested" } */ + #pragma omp cancel parallel /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ + #pragma omp cancel for /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ + #pragma omp cancel sections /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ + #pragma omp cancel taskgroup /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ + #pragma omp cancellation point parallel /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ + #pragma omp cancellation point for /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ + #pragma omp cancellation point sections /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ + #pragma omp cancellation point taskgroup /* { dg-error "only .distribute. or .parallel. regions are allowed to be strictly nested" } */ } #pragma omp target teams distribute for (i = 0; i < 10; i++) --- gcc/testsuite/c-c++-common/gomp/clauses-4.c.jj 2015-10-14 10:25:30.000000000 +0200 +++ gcc/testsuite/c-c++-common/gomp/clauses-4.c 2015-11-06 17:46:55.157988821 +0100 @@ -57,40 +57,62 @@ foo (int y, short z) #pragma omp distribute parallel for ordered /* { dg-error ".ordered. is not valid for .#pragma omp distribute parallel for." } */ for (x = 0; x < 64; x++) { - #pragma omp ordered /* { dg-error "ordered region must be closely nested inside a loop region with an ordered clause" } */ + #pragma omp ordered /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ ; } #pragma omp target teams #pragma omp distribute parallel for simd ordered /* { dg-error ".ordered. is not valid for .#pragma omp distribute parallel for simd." } */ for (x = 0; x < 64; x++) { - #pragma omp ordered simd, threads /* { dg-error "OpenMP constructs other than .#pragma omp ordered simd. may not be nested inside simd region" } */ + #pragma omp ordered simd, threads ; } #pragma omp target #pragma omp teams distribute parallel for ordered /* { dg-error ".ordered. is not valid for .#pragma omp teams distribute parallel for." } */ for (x = 0; x < 64; x++) { - #pragma omp ordered /* { dg-error "ordered region must be closely nested inside a loop region with an ordered clause" } */ + #pragma omp ordered /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ ; } #pragma omp target #pragma omp teams distribute parallel for simd ordered /* { dg-error ".ordered. is not valid for .#pragma omp teams distribute parallel for simd." } */ for (x = 0; x < 64; x++) { - #pragma omp ordered simd, threads /* { dg-error "OpenMP constructs other than .#pragma omp ordered simd. may not be nested inside simd region" } */ + #pragma omp ordered simd, threads ; } #pragma omp target teams distribute parallel for ordered /* { dg-error ".ordered. is not valid for .#pragma omp target teams distribute parallel for." } */ for (x = 0; x < 64; x++) { - #pragma omp ordered /* { dg-error "ordered region must be closely nested inside a loop region with an ordered clause" } */ + #pragma omp ordered /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ ; } #pragma omp target teams distribute parallel for simd ordered /* { dg-error ".ordered. is not valid for .#pragma omp target teams distribute parallel for simd." } */ for (x = 0; x < 64; x++) { - #pragma omp ordered simd, threads /* { dg-error "OpenMP constructs other than .#pragma omp ordered simd. may not be nested inside simd region" } */ + #pragma omp ordered simd, threads + ; + } + #pragma omp simd + for (x = 0; x < 64; x++) + { + #pragma omp ordered threads simd /* { dg-error ".ordered simd threads. must be closely nested inside of .for simd. region" } */ + ; + } + #pragma omp for + for (x = 0; x < 64; x++) + { + #pragma omp simd + for (y = 0; y < 16; y++) + { + #pragma omp ordered simd threads /* { dg-error ".ordered simd threads. must be closely nested inside of .for simd. region" } */ + ; + } + } + #pragma omp for simd + for (x = 0; x < 64; x++) + { + #pragma omp ordered threads simd ; } } --- gcc/testsuite/c-c++-common/gomp/doacross-1.c.jj 2015-10-14 10:25:30.000000000 +0200 +++ gcc/testsuite/c-c++-common/gomp/doacross-1.c 2015-11-06 17:32:49.254950430 +0100 @@ -32,8 +32,8 @@ foo (void) #pragma omp ordered depend (sink: i - 1, j - 2) /* { dg-error "does not match number" } */ #pragma omp ordered depend (source) } - #pragma omp ordered depend (sink: j) /* { dg-error "clause must be closely nested inside an ordered loop" } */ - #pragma omp ordered depend (source) /* { dg-error "clause must be closely nested inside an ordered loop" } */ + #pragma omp ordered depend (sink: j) /* { dg-error "clause must be closely nested inside an .ordered. loop" } */ + #pragma omp ordered depend (source) /* { dg-error "clause must be closely nested inside an .ordered. loop" } */ #pragma omp for ordered (1) for (i = 0; i < 64; i++) { --- gcc/testsuite/c-c++-common/gomp/nesting-2.c.jj 2015-11-06 18:50:49.726005928 +0100 +++ gcc/testsuite/c-c++-common/gomp/nesting-2.c 2015-11-06 19:02:13.945370277 +0100 @@ -0,0 +1,154 @@ +void +foo (void) +{ + int i; + #pragma omp taskloop + for (i = 0; i < 64; i++) + { + int j; + #pragma omp for /* { dg-error "region may not be closely nested inside of" } */ + for (j = 0; j < 10; j++) + ; + #pragma omp single /* { dg-error "region may not be closely nested inside of" } */ + ; + #pragma omp sections /* { dg-error "region may not be closely nested inside of" } */ + { + #pragma omp section + ; + } + #pragma omp barrier /* { dg-error "region may not be closely nested inside of" } */ + #pragma omp master /* { dg-error "region may not be closely nested inside of" } */ + ; + #pragma omp ordered /* { dg-error "region may not be closely nested inside of" } */ + ; + #pragma omp ordered threads /* { dg-error "region may not be closely nested inside of" } */ + ; + #pragma omp ordered simd threads /* { dg-error ".ordered. .simd. must be closely nested inside .simd. region" } */ + ; + #pragma omp simd + for (j = 0; j < 10; j++) + #pragma omp ordered simd + ; + #pragma omp critical + { + #pragma omp simd + for (j = 0; j < 10; j++) + #pragma omp ordered simd + ; + } + } + #pragma omp taskloop + for (i = 0; i < 64; i++) + #pragma omp parallel + { + int j; + #pragma omp for + for (j = 0; j < 10; j++) + ; + #pragma omp single + ; + #pragma omp sections + { + #pragma omp section + ; + } + #pragma omp barrier + #pragma omp master + ; + #pragma omp ordered /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ + ; + #pragma omp ordered threads /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ + ; + #pragma omp simd + for (j = 0; j < 10; j++) + #pragma omp ordered simd + ; + #pragma omp critical + { + #pragma omp simd + for (j = 0; j < 10; j++) + #pragma omp ordered simd + ; + } + } + #pragma omp taskloop + for (i = 0; i < 64; i++) + #pragma omp target + { + int j; + #pragma omp for + for (j = 0; j < 10; j++) + ; + #pragma omp single + ; + #pragma omp sections + { + #pragma omp section + ; + } + #pragma omp barrier + #pragma omp master + ; + #pragma omp ordered /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ + ; + #pragma omp ordered threads /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ + ; + #pragma omp simd + for (j = 0; j < 10; j++) + #pragma omp ordered simd + ; + #pragma omp critical + { + #pragma omp simd + for (j = 0; j < 10; j++) + #pragma omp ordered simd + ; + } + } + #pragma omp ordered + { + #pragma omp ordered /* { dg-error "region may not be closely nested inside of" } */ + ; + } + #pragma omp ordered threads + { + #pragma omp ordered /* { dg-error "region may not be closely nested inside of" } */ + ; + } + #pragma omp ordered + { + #pragma omp ordered threads /* { dg-error "region may not be closely nested inside of" } */ + ; + } + #pragma omp ordered threads + { + #pragma omp ordered threads /* { dg-error "region may not be closely nested inside of" } */ + ; + } + #pragma omp critical + { + #pragma omp ordered simd /* { dg-error ".ordered. .simd. must be closely nested inside .simd. region" } */ + ; + } + #pragma omp for ordered + for (i = 0; i < 64; i++) + #pragma omp parallel + { + #pragma omp ordered threads /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ + ; + } + #pragma omp for ordered + for (i = 0; i < 64; i++) + #pragma omp parallel + { + #pragma omp ordered /* { dg-error ".ordered. region must be closely nested inside a loop region with an .ordered. clause" } */ + ; + } + #pragma omp for ordered(1) + for (i = 0; i < 64; i++) + #pragma omp parallel + { + #pragma omp ordered depend(source) /* { dg-error ".ordered. construct with .depend. clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ + #pragma omp ordered depend(sink: i - 1) /* { dg-error ".ordered. construct with .depend. clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ + } +} --- gcc/testsuite/c-c++-common/gomp/nesting-warn-1.c.jj 2015-10-14 10:25:30.000000000 +0200 +++ gcc/testsuite/c-c++-common/gomp/nesting-warn-1.c 2015-11-06 17:33:30.112372850 +0100 @@ -5,19 +5,19 @@ f_omp_target (void) { #pragma omp target { -#pragma omp target /* { dg-warning "target construct inside of target region" } */ +#pragma omp target /* { dg-warning ".target. construct inside of .target. region" } */ ; -#pragma omp target data map(i) /* { dg-warning "target data construct inside of target region" } */ +#pragma omp target data map(i) /* { dg-warning ".target data. construct inside of .target. region" } */ ; -#pragma omp target update to(i) /* { dg-warning "target update construct inside of target region" } */ +#pragma omp target update to(i) /* { dg-warning ".target update. construct inside of .target. region" } */ #pragma omp parallel { -#pragma omp target /* { dg-warning "target construct inside of target region" } */ +#pragma omp target /* { dg-warning ".target. construct inside of .target. region" } */ ; -#pragma omp target data map(i) /* { dg-warning "target data construct inside of target region" } */ +#pragma omp target data map(i) /* { dg-warning ".target data. construct inside of .target. region" } */ ; -#pragma omp target update to(i) /* { dg-warning "target update construct inside of target region" } */ +#pragma omp target update to(i) /* { dg-warning ".target update. construct inside of .target. region" } */ } } } --- gcc/testsuite/c-c++-common/gomp/ordered-3.c.jj 2015-10-14 10:25:30.000000000 +0200 +++ gcc/testsuite/c-c++-common/gomp/ordered-3.c 2015-11-06 18:33:07.852934306 +0100 @@ -59,6 +59,18 @@ foo (void) #pragma omp ordered depend(sink: i - 1) /* { dg-error "clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ #pragma omp ordered depend(source) /* { dg-error "clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ } + #pragma omp parallel for ordered + for (i = 0; i < 64; i++) + { + #pragma omp ordered depend(sink: i - 1) /* { dg-error "clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ + #pragma omp ordered depend(source) /* { dg-error "clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ + } + #pragma omp parallel for + for (i = 0; i < 64; i++) + { + #pragma omp ordered depend(sink: i - 1) /* { dg-error "clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ + #pragma omp ordered depend(source) /* { dg-error "clause must be closely nested inside a loop with .ordered. clause with a parameter" } */ + } } void --- gcc/testsuite/c-c++-common/gomp/ordered-4.c.jj 2015-11-06 18:38:49.998126943 +0100 +++ gcc/testsuite/c-c++-common/gomp/ordered-4.c 2015-11-06 18:42:22.845142557 +0100 @@ -0,0 +1,54 @@ +void +f1 (void) +{ + int i, j; + #pragma omp critical + { + #pragma omp simd + for (i = 0; i < 64; i++) + { + #pragma omp ordered simd + ; + } + } + #pragma omp ordered threads + { + #pragma omp simd + for (i = 0; i < 64; i++) + { + #pragma omp ordered simd + ; + } + } + #pragma omp task + { + #pragma omp simd + for (i = 0; i < 64; i++) + { + #pragma omp ordered simd + ; + } + } + #pragma omp taskloop + for (j = 0; j < 64; j++) + #pragma omp simd + for (i = 0; i < 64; i++) + { + #pragma omp ordered simd + ; + } +} + +void +f2 (void) +{ + #pragma omp ordered simd + ; +} + +void +f3 (void) +{ + #pragma omp ordered threads , simd + ; +} Jakub