On Mon, Jan 12, 2026 at 09:48:56AM -0800, Jerry D wrote:
> On 1/11/26 12:33 PM, Steve Kargl wrote:
> > The attach patch fixes PR Fortran/91960. This PR is another
> > one from Gerhard in 2019-10.01. A patch has been lingering
> > in the PR since 2023-05-30.
> >
> > The patch checks that an array constructor in a parameter
> > statement is in fact a constant expression. I'll note
> > that the patch requires a special carve out to accommodate
> > the fix for Fortran/117070.
> >
> > 2026-01-11 Steven G. Kargl <[email protected]>
> >
> > PR Fortran/91960
> > * resolve.cc (resolve_fl_parameter): Check the righthand symbol
> > is a constant expression.
> >
> > 2026-01-11 Steven G. Kargl <[email protected]>
> >
> > PR Fortran/91960
> > * gfortran.dg/pr69962.f90: Adjust testcase to ignore new error message.
> > * gfortran.dg/pr91960_1.f90: New test.
> > * gfortran.dg/pr91960_2.f90: Ditto.
> >
>
> I am wondering about the comment:
>
> + /* PR fortran/117070 argues a nonconstant proc pointer can appear in
> + the array constructor of a paramater. I don't buy it, but... */
> + if (sym->value->ts.type == BT_DERIVED
> + && sym->value->ts.u.derived
> + && sym->value->ts.u.derived->attr.proc_pointer_comp)
> + return true;
> + gfc_error ("Expecting constant expression near %L",
> &sym->value->where);
> + return false;
>
> It either is allowed or it is not. Do we need to review the Standard to
> confirm or deny this?
>
It's probably easier to go see the audit in fortran/117070.
Here's a chopped down version of that PR.
module funcs
implicit none
abstract interface
function retchar()
character(len=1) :: retchar
end function
end interface
contains
function a()
character(len=1) :: a
a = 'a'
end function
end module
module dispatch_table
use funcs
implicit none
private
public :: table
public :: build_table, pc
! Procedure container
type :: pc
procedure(retchar), pointer, nopass :: rc => null()
end type
! Static dispatch table
type(pc), parameter :: table(3) = [pc(a)] ! Doesn't work
end module
The fix for 117070 accepts the line marked '! Doesn't work'.
The argument in that PR is that pc(a) is a constant expression.
I don't see how the address of function can be considered a
constant expression; in particular, some OS's support address
relocation and randomization.
--
Steve