| ! { dg-do compile } |
| ! PR63797 - Bogus ambiguous reference to 'sqrt' |
| |
| module mod1 |
| implicit none |
| real, parameter :: z = sqrt (0.0) |
| real :: w = sqrt (1.0) |
| interface |
| pure real function sqrt_ifc (x) |
| real, intent(in) :: x |
| end function sqrt_ifc |
| end interface |
| contains |
| pure function myroot () result (f) |
| procedure(sqrt_ifc), pointer :: f |
| intrinsic :: sqrt |
| f => sqrt |
| end function myroot |
| end module mod1 |
| |
| module mod2 |
| implicit none |
| type t |
| real :: a = 0. |
| end type |
| interface sqrt |
| module procedure sqrt |
| end interface |
| contains |
| elemental function sqrt (a) |
| type(t), intent(in) :: a |
| type(t) :: sqrt |
| sqrt% a = a% a |
| end function sqrt |
| end module mod2 |
| |
| module mod3 |
| implicit none |
| abstract interface |
| function real_func (x) |
| real :: real_func |
| real, intent (in) :: x |
| end function real_func |
| end interface |
| intrinsic :: sqrt |
| procedure(real_func), pointer :: real_root => sqrt |
| end module mod3 |
| |
| program test |
| use mod1 |
| use mod2 |
| use mod3 |
| implicit none |
| type(t) :: x, y |
| procedure(sqrt_ifc), pointer :: root |
| root => myroot () |
| y = sqrt (x) |
| y% a = sqrt (x% a) + z - w + root (x% a) |
| y% a = real_root (x% a) |
| end program test |