Fortran: pure subroutine with pure procedure as dummy [PR106948]

PR fortran/106948

gcc/fortran/ChangeLog:

	* resolve.cc (gfc_pure_function): If a function has been resolved,
	but esym is not yet set, look at its attributes to see whether it
	is pure or elemental.

gcc/testsuite/ChangeLog:

	* gfortran.dg/pure_formal_proc_4.f90: New test.
This commit is contained in:
Harald Anlauf 2025-04-15 20:43:05 +02:00
parent 518efed8cb
commit 4e3060ee17
2 changed files with 56 additions and 0 deletions

View file

@ -3190,6 +3190,13 @@ gfc_pure_function (gfc_expr *e, const char **name)
|| e->value.function.isym->elemental;
*name = e->value.function.isym->name;
}
else if (e->symtree && e->symtree->n.sym && e->symtree->n.sym->attr.dummy)
{
/* The function has been resolved, but esym is not yet set.
This can happen with functions as dummy argument. */
pure = e->symtree->n.sym->attr.pure;
*name = e->symtree->n.sym->name;
}
else
{
/* Implicit functions are not pure. */

View file

@ -0,0 +1,49 @@
! { dg-do compile }
! PR fortran/106948 - check that passing of PURE procedures works
!
! Contributed by Jim Feng
module a
implicit none
interface new
pure module subroutine b(x, f)
integer, intent(inout) :: x
interface
pure function f(x) result(r)
real, intent(in) :: x
real :: r
end function f
end interface
end subroutine b
end interface new
end module a
submodule(a) a_b
implicit none
contains
module procedure b
x = int(f(real(x)) * 0.15)
end procedure b
end submodule a_b
program test
use a
implicit none
integer :: x
x = 100
call new(x, g)
print *, x
contains
pure function g(y) result(r)
real, intent(in) :: y
real :: r
r = sqrt(y)
end function g
end program test