+2015-11-06 Jakub Jelinek <jakub@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.
+
2015-11-06 Aditya Kumar <aditya.k7@samsung.com>
Sebastian Pop <s.pop@samsung.com>
|| 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
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))
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)
&& 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;
}
}
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;
{
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))
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:
{
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;
}
}
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:
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;
}
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;
}
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);
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;
}
}
{
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;
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;
}
}
|| 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;
!= 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)
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);
}
}
+2015-11-06 Jakub Jelinek <jakub@redhat.com>
+
+ * 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.
+
2015-11-06 Mike Stump <mikestump@comcast.net>
* gcc.dg/pragma-diag-5.c: Make test cases unique.
#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)
;
{
#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" } */
}
}
{
#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" } */
}
}
#pragma omp cancellation point taskgroup /* { dg-error "not closely nested inside" } */
}
#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 /* { 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 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++)
{
}
#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++)
#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
;
}
}
#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++)
{
--- /dev/null
+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" } */
+ }
+}
{
#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" } */
}
}
}
#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
--- /dev/null
+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
+ ;
+}
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" } */
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" } */
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
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