Fortran: fix bogus runtime error with optional procedure argument [PR121145]

PR fortran/121145

gcc/fortran/ChangeLog:

	* trans-expr.cc (gfc_conv_procedure_call): Do not create pointer
	check for proc-pointer actual passed to optional dummy.

gcc/testsuite/ChangeLog:

	* gfortran.dg/pointer_check_15.f90: New test.
This commit is contained in:
Harald Anlauf
2025-07-18 21:12:03 +02:00
parent f069bacbf5
commit 8f9450505f
2 changed files with 48 additions and 1 deletions

View File

@ -8159,7 +8159,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
msg = xasprintf ("Pointer actual argument '%s' is not "
"associated", e->symtree->n.sym->name);
else if (attr.proc_pointer && !e->value.function.actual
&& (fsym == NULL || !fsym_attr.proc_pointer))
&& (fsym == NULL
|| (!fsym_attr.proc_pointer && !fsym_attr.optional)))
msg = xasprintf ("Proc-pointer actual argument '%s' is not "
"associated", e->symtree->n.sym->name);
else

View File

@ -0,0 +1,46 @@
! { dg-do run }
! { dg-additional-options "-O -fcheck=pointer -fdump-tree-original" }
!
! PR fortran/121145
! Erroneous runtime error: Proc-pointer actual argument 'ptr' is not associated
!
! Contributed by Federico Perini.
module m
implicit none
abstract interface
subroutine fun(x)
real, intent(in) :: x
end subroutine fun
end interface
contains
subroutine with_fun(sub)
procedure(fun), optional :: sub
if (present(sub)) stop 1
end subroutine
subroutine with_non_optional(sub)
procedure(fun) :: sub
end subroutine
end module m
program p
use m
implicit none
procedure(fun), pointer :: ptr1 => null()
procedure(fun), pointer :: ptr2 => null()
call with_fun()
call with_fun(sub=ptr1) ! no runtime check here
if (associated (ptr2)) then
call with_non_optional(sub=ptr2) ! runtime check here
end if
end
! { dg-final { scan-tree-dump-times "Proc-pointer actual argument .'ptr2.'" 1 "original" } }