Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.

problem with ABSTRACT INTERFACE

yamajun2
Beginner
261 Views
Hi,

I met a problem with ABSTRACT INTERFACE.
The definition of ABSTRACT INTERFACE in a MODULE cannot be seen from the procedures in that MODULE.

Here is sample codes.

The following code example won't work.
[cpp]MODULE m_mod
IMPLICIT NONE
!
ABSTRACT INTERFACE
INTEGER FUNCTION t_f()
END FUNCTION t_f
END INTERFACE
!
CONTAINS
!------------------------------
INTEGER FUNCTION nf(ifunc)
PROCEDURE (t_f) :: ifunc
PRINT *, ifunc()
RETURN
END FUNCTION nf
!------------------------------
END MODULE m_mod
[/cpp]




This one works.

[cpp]MODULE m_interface
IMPLICIT NONE
!
ABSTRACT INTERFACE
INTEGER FUNCTION t_f()
END FUNCTION t_f
END INTERFACE
!
END MODULE m_interface
!========================================================
MODULE m_mod
USE m_interface
IMPLICIT NONE
CONTAINS
!------------------------------
INTEGER FUNCTION nf(ifunc)
PROCEDURE (t_f) :: ifunc
PRINT *, ifunc()
RETURN
END FUNCTION nf
!------------------------------
END MODULE m_mod
[/cpp]


I believe my first sample is compliant to the Fortran2003 standard, but I'm not sure.


What I'm trying to do is passing a comparison function to general sort routine.
Here is my full code, where I met this problem.

[cpp]MODULE m_interface
IMPLICIT NONE
ABSTRACT INTERFACE
ELEMENTAL LOGICAL FUNCTION t_cmp(x1, x2)
REAL, INTENT(IN) :: x1, x2
END FUNCTION t_cmp
END INTERFACE
END MODULE m_interface
!========================================================
MODULE m_sort
USE m_interface
IMPLICIT NONE
!ABSTRACT INTERFACE
! ELEMENTAL LOGICAL FUNCTION t_cmp(x1, x2)
! REAL, INTENT(IN) :: x1, x2
! END FUNCTION t_cmp
!END INTERFACE
CONTAINS
!-----------------------------------------------------
RECURSIVE FUNCTION quick_sort(x, f) RESULT(res)
REAL, INTENT(IN) :: x(:)
REAL :: res(SIZE(x))
PROCEDURE (t_cmp) :: f
LOGICAL :: mask(SIZE(x) - 1)
IF (SIZE(x) > 1) THEN
mask = f(x(2:), x(1))
res = [ quick_sort( PACK(x(2:), mask), f ), &
x(1), &
quick_sort( PACK(x(2:), .NOT. mask), f ) ]
ELSE
res = x
END IF
RETURN
END FUNCTION quick_sort
! Reference : Arjen Markus, ACM Fortran Forum 27 (2008) 2-5.
!-----------------------------------------------------
END MODULE m_sort
!========================================================
MODULE m_func
IMPLICIT NONE
CONTAINS
!-----------------------------------------------------
ELEMENTAL LOGICAL FUNCTION lt(a, b)
REAL, INTENT(IN) :: a, b
IF (a < b) THEN
lt = .TRUE.
ELSE
lt = .FALSE.
ENDIF
RETURN
END FUNCTION lt
!-----------------------------------------------------
ELEMENTAL LOGICAL FUNCTION gt(a, b)
REAL, INTENT(IN) :: a, b
IF (a > b) THEN
gt = .TRUE.
ELSE
gt = .FALSE.
ENDIF
RETURN
END FUNCTION gt
!-----------------------------------------------------
END MODULE m_func
!========================================================
PROGRAM sort
USE m_sort
USE m_func
IMPLICIT NONE
REAL :: x(30)
PROCEDURE (t_cmp), POINTER :: fp
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(x)
fp => lt
PRINT *, quick_sort(x, fp)
PRINT *
fp => gt
PRINT *, quick_sort(x, fp)
STOP
END PROGRAM sort
[/cpp]




Yamajun.
0 Kudos
3 Replies
Steven_L_Intel1
Employee
261 Views
I think this is a known bug but I won't be able to look it up until I return to the office tomorrow. There may be a workaround.
0 Kudos
Steven_L_Intel1
Employee
261 Views
Yes, this is the same problem and I see it is fixed for a release later this year. The bug is that ABSTRACT INTERFACEs cannot be host-associated. They can be use-associated, though. For example, this works:

[plain]MODULE m_mod
IMPLICIT NONE
!
ABSTRACT INTERFACE  
INTEGER FUNCTION t_f()  
END FUNCTION t_f
END INTERFACE
END MODULE m_mod

module m2_mod
!
CONTAINS
!------------------------------
INTEGER FUNCTION nf(ifunc)
USE m_mod
PROCEDURE (t_f) :: ifunc
PRINT *, ifunc()
nf = 0
RETURN
END FUNCTION nf
!------------------------------
END MODULE m2_mod[/plain]
This is our issue DPD200051171
0 Kudos
Steven_L_Intel1
Employee
261 Views
Fixed in 11.1.
0 Kudos
Reply