https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94690

--- Comment #5 from Tobias Burnus <burnus at gcc dot gnu.org> ---
(In reply to Tobias Burnus from comment #0)
> * pr66199-9.f90 – gives an ICE in omp_add_variable
>   (if 'lastprivate' is permitted, otherwise, it is rejected.)

Reduced test case (needs patch to permit lastprivate in
OMP_DISTRIBUTE_CLAUSES):
  internal compiler error: in omp_add_variable, at gimplify.c:6958

integer function f2 ()
  implicit none
  integer :: d, a
! !$omp teams shared(d) shared(a)
  !$omp distribute lastprivate(d)
  do d = 1, 2
    a = d * 5
  end do

! !$omp end teams
  f2 = d
end

["omp teams" is not needed for the ICE, but without the C testcase fails with:
 "lastprivate variable ‘d’ is private in outer context"]

The problem is (original dump):
  #pragma omp distribute private(d) lastprivate(d)

Mixing 'private' + 'lastprivate' is bad.

 * * *

The private is added in gfc_trans_omp_do, as dovar_found == 0.

We have:
* clauses->lists[OMP_LIST_LASTPRIVATE]->sym->name
$41 = 0x7ffff78c0128 "d"

* clauses->lists[OMP_LIST_PRIVATE] == NULL

And the code (in gfc_trans_omp_do):

          if (op != EXEC_OMP_DISTRIBUTE)
            for (n = clauses->lists[(op == EXEC_OMP_SIMD && collapse == 1)
                                    ? OMP_LIST_LINEAR : OMP_LIST_LASTPRIVATE];
...
          else if (n == NULL && op != EXEC_OMP_SIMD)
            for (n = clauses->lists[OMP_LIST_PRIVATE]; n != NULL; n = n->next)

Reply via email to