aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimplify.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-10-26 18:21:56 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2016-10-26 18:21:56 +0200
commit3693a620f010b3c47b23d316f110dad10e1fd5b1 (patch)
tree398e75f9adf7e8e422a97f371c7d60d564affc4c /gcc/gimplify.c
parent984fa0eacb8a9e738305bed0deff3f36830bf04b (diff)
downloadgcc-3693a620f010b3c47b23d316f110dad10e1fd5b1.zip
gcc-3693a620f010b3c47b23d316f110dad10e1fd5b1.tar.gz
gcc-3693a620f010b3c47b23d316f110dad10e1fd5b1.tar.bz2
re PR fortran/77973 (ICE in scan_omp_1_op, at omp-low.c:3841)
PR fortran/77973 * gimplify.c (gimplify_adjust_omp_clauses_1): For all added map clauses with OMP_CLAUSE_SIZE being a decl, call omp_notice_variable on outer context if any. * gfortran.dg/gomp/pr77973.f90: New test. Co-Authored-By: Martin Liska <mliska@suse.cz> From-SVN: r241581
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r--gcc/gimplify.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index d855c67..5da1725 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -8421,9 +8421,10 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
&& omp_shared_to_firstprivate_optimizable_decl_p (decl))
omp_mark_stores (gimplify_omp_ctxp->outer_context, decl);
+ tree chain = *list_p;
clause = build_omp_clause (input_location, code);
OMP_CLAUSE_DECL (clause) = decl;
- OMP_CLAUSE_CHAIN (clause) = *list_p;
+ OMP_CLAUSE_CHAIN (clause) = chain;
if (private_debug)
OMP_CLAUSE_PRIVATE_DEBUG (clause) = 1;
else if (code == OMP_CLAUSE_PRIVATE && (flags & GOVD_PRIVATE_OUTER_REF))
@@ -8450,7 +8451,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
OMP_CLAUSE_SET_MAP_KIND (clause, GOMP_MAP_ALLOC);
OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (clause) = 1;
OMP_CLAUSE_SET_MAP_KIND (nc, GOMP_MAP_FIRSTPRIVATE_POINTER);
- OMP_CLAUSE_CHAIN (nc) = *list_p;
+ OMP_CLAUSE_CHAIN (nc) = chain;
OMP_CLAUSE_CHAIN (clause) = nc;
struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
gimplify_omp_ctxp = ctx->outer_context;
@@ -8520,7 +8521,7 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
tree nc = build_omp_clause (input_location, OMP_CLAUSE_LASTPRIVATE);
OMP_CLAUSE_DECL (nc) = decl;
OMP_CLAUSE_LASTPRIVATE_FIRSTPRIVATE (nc) = 1;
- OMP_CLAUSE_CHAIN (nc) = *list_p;
+ OMP_CLAUSE_CHAIN (nc) = chain;
OMP_CLAUSE_CHAIN (clause) = nc;
struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
gimplify_omp_ctxp = ctx->outer_context;
@@ -8531,6 +8532,12 @@ gimplify_adjust_omp_clauses_1 (splay_tree_node n, void *data)
struct gimplify_omp_ctx *ctx = gimplify_omp_ctxp;
gimplify_omp_ctxp = ctx->outer_context;
lang_hooks.decls.omp_finish_clause (clause, pre_p);
+ if (gimplify_omp_ctxp)
+ for (; clause != chain; clause = OMP_CLAUSE_CHAIN (clause))
+ if (OMP_CLAUSE_CODE (clause) == OMP_CLAUSE_MAP
+ && DECL_P (OMP_CLAUSE_SIZE (clause)))
+ omp_notice_variable (gimplify_omp_ctxp, OMP_CLAUSE_SIZE (clause),
+ true);
gimplify_omp_ctxp = ctx;
return 0;
}