Hello Jerry and Christopher,
The patch does as advertised on the box. However, the attached test fails with:
pault@fedora:~/prs/pdt$ ~/gfc/bin/gfortran ~/prs/pr100194/p*.f90 -g
-std=f2018 -fdump-tree-original ;./a.out
s(x(1:4:2) => z = 252 0
s(u(1,:) => z = 5376 0 0 0
whereas the other brands give no output.
Cheers
Paul
On Tue, 31 Mar 2026 at 20:30, Jerry D <[email protected]> wrote:
>
> The attached patch from Christopher.
>
> I adjusted the commit log a little bit and added the two previously provided
> test cases from the PR, z2 and z3, which passed without the patch and still
> do.
>
> The patch itself is is simple.
>
> Regression tested on x86_64-linux.
>
> I plane to commit this later today.
>
> Regards,
>
> Jerry
>
> ----
>
> commit 9d0f9b8f1a11a2e08786278e05ee5cbb77f5b7ff (HEAD -> master)
> Author: Christopher Albert <[email protected]>
> Date: Tue Mar 31 08:26:57 2026 +0200
>
> fortran: Fix ICE in gfc_trans_create_temp_array for assumed-rank
> [PR100194]
>
> When a non-contiguous assumed-rank actual argument is passed to a
> contiguous assumed-rank dummy, the compiler routes it through
> gfc_conv_subref_array_arg which uses the scalarizer. The scalarizer
> requires known rank at compile time, but assumed-rank arrays have
> rank = -1, hitting gcc_assert (ss->dimen > 0).
>
> Skip the scalarizer path for assumed-rank expressions and let them
> fall through to gfc_conv_array_parameter, which handles assumed-rank
> via the runtime pack/unpack functions.
>
> gcc/fortran/ChangeLog:
>
> PR fortran/100194
> * trans-expr.cc (gfc_conv_procedure_call): Skip
> gfc_conv_subref_array_arg for assumed-rank actual arguments
> (e->rank == -1) when the dummy is contiguous.
>
> gcc/testsuite/ChangeLog:
>
> PR fortran/100194
> * gfortran.dg/pr100194.f90: New test.
>
> Signed-off-by: Christopher Albert <[email protected]>
subroutine s(x, res)
integer :: x(..)
integer, allocatable :: res(:)
select rank (x)
rank (1)
end select
call t(x)
contains
subroutine t(y)
integer, contiguous :: y(..)
select rank (y)
rank (1)
res = 2*y
end select
end
end
interface
subroutine s(x, res)
integer :: x(..)
integer, allocatable :: res(:)
end
end interface
type :: t
character(4) :: chr
integer :: r(2)
end type
integer :: x(4) = [42,84,126,168]
type(t) :: y = t('abcd', [42,84])
integer, allocatable :: z(:), u(:,:)
u = reshape ([x,4*x,16*x,64*x],[4,4])
call s(x, z)
if (any (z /= [84,168,252,336])) print *, 'Original bug => z = ', z
call s(x(1:4:2), z)
if (any (z /= [84,252])) print *, 's(x(1:4:2) => z = ', z
call s(x([1,3,4,2]), z)
if (any (z /= [84,252,336,168])) print *, 's(x([1,3,4,2]) => z = ', z
call s(y%r, z)
if (any (z /= [84,168])) print *, 's(y%r => z = ', z
call s(u(1,:), z)
if (any (z /= [84,336,1344,5376])) print *, 's(u(1,:) => z = ', z
call s(u(:,1), z)
if (any (z /= [84,168,252,336])) print *, 's(u(:,1) => z = ', z
end