OpenMP task reduction lowering can call gfc_omp_clause_default_ctor for
an allocatable scalar with outer == NULL_TREE. That is valid for scalar
allocatables that only need fresh storage allocation and do not need a
copied descriptor or allocatable-component walk.
The Fortran hook asserted unconditionally on outer != NULL_TREE, so
reduction(task, +:r) with an allocatable scalar ICEd during omplower.
Fix this by requiring outer only for the cases that actually use it:
descriptor-based allocatables and types with allocatable components.
Keep the assertion for those cases and allow NULL outer for plain scalar
allocatables. Add a regression test for the allocatable task-reduction
case.
gcc/fortran/ChangeLog:
PR fortran/102596
* trans-openmp.cc (gfc_omp_clause_default_ctor): Only require an
outer reference when the constructor path actually uses it.
gcc/testsuite/ChangeLog:
PR fortran/102596
* gfortran.dg/pr102596.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
return NULL_TREE;
}
- gcc_assert (outer != NULL_TREE);
+ gcc_assert (outer != NULL_TREE
+ || (!GFC_DESCRIPTOR_TYPE_P (type)
+ && !gfc_has_alloc_comps (type, OMP_CLAUSE_DECL (clause),
+ false)));
/* Allocatable arrays and scalars in PRIVATE clauses need to be set to
"not currently allocated" allocation status if outer
--- /dev/null
+! { dg-do compile }
+! { dg-additional-options "-fopenmp" }
+
+program p
+ integer, allocatable :: r
+
+ allocate (r)
+ r = 0
+
+ !$omp target parallel reduction(task, +:r)
+ r = r + 1
+ !$omp end target parallel
+end