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
This commit is contained in:
Jakub Jelinek 2016-10-26 18:21:56 +02:00 committed by Jakub Jelinek
parent 984fa0eacb
commit 3693a620f0
4 changed files with 35 additions and 3 deletions

View File

@ -1,3 +1,11 @@
2016-10-26 Jakub Jelinek <jakub@redhat.com>
Martin Liska <mliska@suse.cz>
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.
2016-10-26 Jakub Jelinek <jakub@redhat.com>
* gen-pass-instances.awk (adjust_linenos): INcrement pass_lines[p]

View File

@ -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;
}

View File

@ -1,3 +1,8 @@
2016-10-26 Jakub Jelinek <jakub@redhat.com>
PR fortran/77973
* gfortran.dg/gomp/pr77973.f90: New test.
2016-10-26 Paul Thomas <pault@gcc.gnu.org>
PR fortran/78108

View File

@ -0,0 +1,12 @@
! PR fortran/77973
! { dg-do compile }
subroutine s(x)
integer :: x(:)
integer :: i
!$omp parallel
!$omp target
x(1) = 1
!$omp end target
!$omp end parallel
end