! { dg-do run } interface integer function foo () end function integer function bar () end function integer function baz () end function end interface procedure(foo), pointer :: ptr integer :: i ptr => foo !$omp parallel shared (ptr) if (ptr () /= 1) call abort !$omp end parallel ptr => bar !$omp parallel firstprivate (ptr) if (ptr () /= 2) call abort !$omp end parallel !$omp parallel sections lastprivate (ptr) !$omp section ptr => foo if (ptr () /= 1) call abort !$omp section ptr => bar if (ptr () /= 2) call abort !$omp section ptr => baz if (ptr () /= 3) call abort !$omp end parallel sections if (ptr () /= 3) call abort if (.not.associated (ptr, baz)) call abort end integer function foo () foo = 1 end function integer function bar () bar = 2 end function integer function baz () baz = 3 end function