]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Allow task-reduction allocatable scalars without outer ref [PR102596]
authorChristopher Albert <albert@tugraz.at>
Tue, 10 Mar 2026 18:16:24 +0000 (19:16 +0100)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 12 Mar 2026 23:57:30 +0000 (16:57 -0700)
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>
gcc/fortran/trans-openmp.cc
gcc/testsuite/gfortran.dg/pr102596.f90 [new file with mode: 0644]

index 3dd4cf272e55c5bc866c250edcd7c53a4c887fcc..2842a0c191c8404033a579d0643bf2a65d2c9bc7 100644 (file)
@@ -815,7 +815,10 @@ gfc_omp_clause_default_ctor (tree clause, tree decl, tree outer)
       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
diff --git a/gcc/testsuite/gfortran.dg/pr102596.f90 b/gcc/testsuite/gfortran.dg/pr102596.f90
new file mode 100644 (file)
index 0000000..b8c3b2f
--- /dev/null
@@ -0,0 +1,13 @@
+! { 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