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

Reply via email to