On 1/12/26 12:04 PM, Steve Kargl wrote:
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
I tested all of your test cases here with flang and it agrees with your error
messages. Simalarly with you chopped down test case here. I also tested the
proc_target_1.f90 with flang and it does not object. So at least one other
compiler lines up with gfortran with your patch applied.
It does seem inconsistent so I want to revise the comment as:
/* PR fortran/117070 argues a nonconstant proc pointer can appear in
the array constructor of a paramater. This seems inconsistant with
the concept of a parameter. TODO: Needs an interpretation. */
and plan to commit shortly.
Regards,
Jerry