| ! { dg-do compile } |
| ! |
| ! PR fortran/56969 |
| ! |
| ! Contributed by Salvatore Filippone |
| ! |
| ! Was before rejected as the different c_associated weren't recognized to |
| ! come from the same module. |
| ! |
| module test_mod |
| use iso_c_binding |
| |
| type(c_ptr), save :: test_context = c_null_ptr |
| |
| type, bind(c) :: s_Cmat |
| type(c_ptr) :: Mat = c_null_ptr |
| end type s_Cmat |
| |
| |
| interface |
| function FtestCreate(context) & |
| & bind(c,name="FtestCreate") result(res) |
| use iso_c_binding |
| type(c_ptr) :: context |
| integer(c_int) :: res |
| end function FtestCreate |
| end interface |
| contains |
| |
| function initFtest() result(res) |
| implicit none |
| integer(c_int) :: res |
| if (c_associated(test_context)) then |
| res = 0 |
| else |
| res = FtestCreate(test_context) |
| end if |
| end function initFtest |
| end module test_mod |
| |
| module base_mat_mod |
| type base_sparse_mat |
| integer, allocatable :: ia(:) |
| end type base_sparse_mat |
| end module base_mat_mod |
| |
| module extd_mat_mod |
| |
| use iso_c_binding |
| use test_mod |
| use base_mat_mod |
| |
| type, extends(base_sparse_mat) :: extd_sparse_mat |
| type(s_Cmat) :: deviceMat |
| end type extd_sparse_mat |
| |
| end module extd_mat_mod |
| |
| subroutine extd_foo(a) |
| |
| use extd_mat_mod |
| implicit none |
| class(extd_sparse_mat), intent(inout) :: a |
| |
| if (c_associated(a%deviceMat%Mat)) then |
| write(*,*) 'C Associated' |
| end if |
| |
| end subroutine extd_foo |