There seems to be a bug involving procedure pointers and OpenMP when using the 
default(none) clause when starting a parallel region.  This means that if there 
is a procedure pointer inside a parallel region, and a default(none) clause is 
present, a compile time error will occur.  If the default(none) clause is 
removed, or replaced by default(shared), the program compiles properly.

I think GNU Fortran is confusing whether a procedure pointer is a variable or 
not.  If it is a variable then it must be defined when default(none) is 
specified.  However, it is not allowed as a variable name in a shared clause.  
Is a procedure pointer a variable or not?

FYI the Intel compiler allows all conventions shown below.  I know Intel 
Fortran is often loose on enforcing standard compliance, so I don't know which 
method is right, but something should be done to allow a default(none) clause 
with procedure pointers.

Best Regards,
David Bal

P.S.  This problem occurs with GFortran 4.6, 4.8 and the latest 4.9 
experimental.



! EXAMPLE CODE BELOW
module test

contains

subroutine double(a)
integer, intent(in out) :: a
    a = a * 2
end subroutine double

end module test

program procedure_pointer_openmp_bug
    use test
    implicit none

    interface
        subroutine My_Interface(A)
            integer, intent(in out) :: a
        end subroutine My_Interface
    end interface

    procedure (My_Interface), pointer :: math
    integer, parameter :: nA = 10
    integer, dimension(nA) :: A = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    integer :: i

    math => double

    ! ***VERSION 1 - Error: ‘math’ not specified in enclosing parallel
!    !$omp parallel do &
!    !$omp default(none) &
!    !$omp shared(A)

    ! ***VERSION 2 - Error: Object 'math' is not a variable at (1)
!    !$omp parallel do &
!    !$omp default(none) &
!    !$omp shared(A, math)

    ! ***VERSION 3 - COMPILES AND RUNS
!    !$omp parallel do &
!    !$omp default(shared) &
!    !$omp shared(A)

    ! ***VERSION 4 - COMPILES AND RUNS
    !$omp parallel do &
    !$omp shared(A)
    do i = 1, nA
        call math(A(i))
    end do
    !$omp end parallel do

    write (*,*) A

end program procedure_pointer_openmp_bug
! EXAMPLE CODE ABOVE

Reply via email to