[gcc r16-7686] fortran: Fix iterator counting in nested block scopes [PR fortran/124208]
Jerry DeLisle
jvdelisle@gcc.gnu.org
Wed Feb 25 02:57:33 GMT 2026
https://gcc.gnu.org/g:97965bdc1ed36f97a6e2ec2ee7bc208dd05d8c18
commit r16-7686-g97965bdc1ed36f97a6e2ec2ee7bc208dd05d8c18
Author: Christopher Albert <albert@tugraz.at>
Date: Mon Feb 23 22:42:44 2026 +0100
fortran: Fix iterator counting in nested block scopes [PR fortran/124208]
Count FORALL/DO CONCURRENT iterators in EXEC_BLOCK namespace code chains
while sizing VAR_EXPR in gfc_resolve_forall.
This prevents undersized allocation and an ICE for nested FORALL/DO
CONCURRENT inside ASSOCIATE/BLOCK constructs.
PR fortran/124208
gcc/fortran/ChangeLog:
* resolve.cc (gfc_max_forall_iterators_in_chain): Count
iterators in EXEC_BLOCK namespaces.
gcc/testsuite/ChangeLog:
* gfortran.dg/pr124208.f90: New test.
Signed-off-by: Christopher Albert <albert@tugraz.at>
Diff:
---
gcc/fortran/resolve.cc | 7 ++++++
gcc/testsuite/gfortran.dg/pr124208.f90 | 40 ++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 655db8a1c9cf..d28d00a03a00 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -12449,6 +12449,13 @@ gfc_max_forall_iterators_in_chain (gfc_code *code)
if (c->op == EXEC_FORALL || c->op == EXEC_DO_CONCURRENT)
sub_iters = gfc_count_forall_iterators (c);
+ else if (c->op == EXEC_BLOCK)
+ {
+ /* BLOCK/ASSOCIATE bodies live in the block namespace code chain,
+ not in the generic c->block arm list used by IF/SELECT. */
+ if (c->ext.block.ns && c->ext.block.ns->code)
+ sub_iters = gfc_max_forall_iterators_in_chain (c->ext.block.ns->code);
+ }
else if (c->block)
for (gfc_code *b = c->block; b; b = b->block)
{
diff --git a/gcc/testsuite/gfortran.dg/pr124208.f90 b/gcc/testsuite/gfortran.dg/pr124208.f90
new file mode 100644
index 000000000000..be833d19e654
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr124208.f90
@@ -0,0 +1,40 @@
+! { dg-do compile }
+! PR fortran/124208
+
+subroutine nested_forall_in_associate
+ implicit none
+ integer :: lane
+ integer :: box(6)
+
+ box = 0
+ do concurrent (lane = 1:4)
+ associate (idx => lane)
+ forall (idx = 1:3, box(idx) == 0)
+ box(mod (idx + lane - 1, 3) + 1) = idx + lane
+ end forall
+ end associate
+ end do
+end subroutine nested_forall_in_associate
+
+subroutine shadowed_do_concurrent_blocks
+ implicit none
+ integer :: i
+ integer :: acc(8)
+
+ acc = 0
+ block
+ integer :: i
+ i = 2
+ do concurrent (i = 1:3)
+ associate (base => i)
+ block
+ integer :: i
+ i = base + 1
+ do concurrent (i = base + 1:5)
+ acc(i) = acc(i) + i
+ end do
+ end block
+ end associate
+ end do
+ end block
+end subroutine shadowed_do_concurrent_blocks
More information about the Gcc-cvs
mailing list