diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2019-04-17 10:34:20 +0200 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gcc.gnu.org> | 2019-04-17 10:34:20 +0200 |
commit | b39c686b82ddfa60efe55d437121e0029644e509 (patch) | |
tree | a6adcd73b96508a3e86b88d6e2aa553667de343c /gcc/fortran/openmp.c | |
parent | 04017685100da5a1886be9739bbf1d0e3977263f (diff) | |
download | gcc-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.c | 20 |
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; } |