aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/openmp.c
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2019-04-17 10:34:20 +0200
committerThomas Schwinge <tschwinge@gcc.gnu.org>2019-04-17 10:34:20 +0200
commitb39c686b82ddfa60efe55d437121e0029644e509 (patch)
treea6adcd73b96508a3e86b88d6e2aa553667de343c /gcc/fortran/openmp.c
parent04017685100da5a1886be9739bbf1d0e3977263f (diff)
downloadgcc-b39c686b82ddfa60efe55d437121e0029644e509.zip
gcc-b39c686b82ddfa60efe55d437121e0029644e509.tar.gz
gcc-b39c686b82ddfa60efe55d437121e0029644e509.tar.bz2
[PR90048] Fortran OpenACC 'private' clause rejected for predetermined private loop iteration variable
gcc/fortran/ PR fortran/90048 * openmp.c (gfc_resolve_do_iterator): Handle sharing_clauses for OpenACC, too. (gfc_resolve_oacc_blocks): Populate sharing_clauses with private clauses. gcc/testsuite/ PR fortran/90048 * gfortran.dg/goacc/private-explicit-kernels-1.f95: New file. * gfortran.dg/goacc/private-explicit-parallel-1.f95: Likewise. * gfortran.dg/goacc/private-explicit-routine-1.f95: Likewise. From-SVN: r270406
Diffstat (limited to 'gcc/fortran/openmp.c')
-rw-r--r--gcc/fortran/openmp.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
index 9fc2367..1c7bce6 100644
--- a/gcc/fortran/openmp.c
+++ b/gcc/fortran/openmp.c
@@ -5510,8 +5510,7 @@ gfc_resolve_do_iterator (gfc_code *code, gfc_symbol *sym, bool add_clause)
if (!omp_current_ctx->is_openmp && !oacc_is_loop (omp_current_ctx->code))
return;
- if (omp_current_ctx->is_openmp
- && omp_current_ctx->sharing_clauses->contains (sym))
+ if (omp_current_ctx->sharing_clauses->contains (sym))
return;
if (! omp_current_ctx->private_iterators->add (sym) && add_clause)
@@ -5971,19 +5970,34 @@ void
gfc_resolve_oacc_blocks (gfc_code *code, gfc_namespace *ns)
{
fortran_omp_context ctx;
+ gfc_omp_clauses *omp_clauses = code->ext.omp_clauses;
+ gfc_omp_namelist *n;
+ int list;
resolve_oacc_loop_blocks (code);
ctx.code = code;
- ctx.sharing_clauses = NULL;
+ ctx.sharing_clauses = new hash_set<gfc_symbol *>;
ctx.private_iterators = new hash_set<gfc_symbol *>;
ctx.previous = omp_current_ctx;
ctx.is_openmp = false;
omp_current_ctx = &ctx;
+ for (list = 0; list < OMP_LIST_NUM; list++)
+ switch (list)
+ {
+ case OMP_LIST_PRIVATE:
+ for (n = omp_clauses->lists[list]; n; n = n->next)
+ ctx.sharing_clauses->add (n->sym);
+ break;
+ default:
+ break;
+ }
+
gfc_resolve_blocks (code->block, ns);
omp_current_ctx = ctx.previous;
+ delete ctx.sharing_clauses;
delete ctx.private_iterators;
}