https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117070
Bug ID: 117070 Summary: Procedure target error with parameter structure constructor Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: ivan.pribec at gmail dot com Target Milestone: --- Currently, a procedure target cannot be used in a structure constructor of a constant: Test case: ! dispatch_test.f90 -- ! Dispatch table using procedure pointers module funcs abstract interface function retchar() character(len=1) :: retchar end function end interface contains function a() character(len=1) :: a a = 'a' end function function b() character(len=1) :: b b = 'b' end function function c() character(len=1) :: c c = 'c' 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),pc(b),pc(c)] ! Doesn't work ! According to J2/24-007, section 7.5.10, a procedure target ! can be used in the structure constructor. contains ! Dynamic dispatch table function build_table() result(table) type(pc) :: table(3) table = [pc(a),pc(b),pc(c)] ! This works end function end module program test use dispatch_table, only: pc, build_table implicit none type(pc) :: table(3) table = build_table() ! Dynamic table associate(abc => & table(1)%rc()//table(2)%rc()//table(3)%rc()) if (abc /= 'abc') stop 1 end associate block use dispatch_table, only: table ! Static table associate(abc => & table(1)%rc()//table(2)%rc()//table(3)%rc()) if (abc /= 'abc') stop 2 end associate end block print *, 'PASS' end program