Hi Jakub, This patch fixes the two ICEs listed on PR77371. One is due to the Fortran omp_privatize_by_reference hook returning true for types like 'character(kind=1)[1:XX] *', causing them to be processed by the path intended for C++ reference types.
The other one is simply not setting 'remove = true' while error_at() was already called. Tested without regressions, committed on gomp-4_0-branch, is this okay for trunk as well? Thanks, Chung-Lin PR fortran/77371 * omp-low.c (lower_omp_target): Avoid reference-type processing on pointers for firstprivate clause. * gimplify.c (gimplify_adjust_omp_clauses): Add 'remove = true' when emitting error on private/firstprivate reductions. testsuite/ * gfortran.dg/goacc/pr77371-1.f90: New test. * gfortran.dg/goacc/pr77371-2.f90: New test.
Index: omp-low.c =================================================================== --- omp-low.c (revision 240699) +++ omp-low.c (working copy) @@ -16238,7 +16238,8 @@ lower_omp_target (gimple_stmt_iterator *gsi_p, omp if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE) { gcc_assert (is_gimple_omp_oacc (ctx->stmt)); - if (is_reference (new_var)) + if (is_reference (new_var) + && TREE_CODE (TREE_TYPE (new_var)) != POINTER_TYPE) { /* Create a local object to hold the instance value. */ Index: gimplify.c =================================================================== --- gimplify.c (revision 240699) +++ gimplify.c (working copy) @@ -8351,13 +8351,16 @@ gimplify_adjust_omp_clauses (gimple_seq *pre_p, gi case OMP_CLAUSE_REDUCTION: decl = OMP_CLAUSE_DECL (c); /* OpenACC reductions need a present_or_copy data clause. - Add one if necessary. Error is the reduction is private. */ + Add one if necessary. Emit error when the reduction is private. */ if (ctx->region_type == ORT_ACC_PARALLEL) { n = splay_tree_lookup (ctx->variables, (splay_tree_key) decl); if (n->value & (GOVD_PRIVATE | GOVD_FIRSTPRIVATE)) - error_at (OMP_CLAUSE_LOCATION (c), "invalid private " - "reduction on %qE", DECL_NAME (decl)); + { + remove = true; + error_at (OMP_CLAUSE_LOCATION (c), "invalid private " + "reduction on %qE", DECL_NAME (decl)); + } else if ((n->value & GOVD_MAP) == 0) { tree next = OMP_CLAUSE_CHAIN (c);
Index: testsuite/gfortran.dg/goacc/pr77371-1.f90 =================================================================== --- testsuite/gfortran.dg/goacc/pr77371-1.f90 (revision 0) +++ testsuite/gfortran.dg/goacc/pr77371-1.f90 (revision 0) @@ -0,0 +1,9 @@ +! PR fortran/77371 +! { dg-do compile } +program p + character(:), allocatable :: z + !$acc parallel + z = 'abc' + !$acc end parallel + print *, z +end Index: testsuite/gfortran.dg/goacc/pr77371-2.f90 =================================================================== --- testsuite/gfortran.dg/goacc/pr77371-2.f90 (revision 0) +++ testsuite/gfortran.dg/goacc/pr77371-2.f90 (revision 0) @@ -0,0 +1,7 @@ +! PR fortran/77371 +! { dg-do compile } +program p + integer, allocatable :: n +!$acc parallel reduction (+:n) private(n) ! { dg-error "invalid private reduction" } +!$acc end parallel +end