summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gfortran.dg/c_ptr_tests.f03
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gfortran.dg/c_ptr_tests.f03')
-rw-r--r--gcc/testsuite/gfortran.dg/c_ptr_tests.f0344
1 files changed, 44 insertions, 0 deletions
diff --git a/gcc/testsuite/gfortran.dg/c_ptr_tests.f03 b/gcc/testsuite/gfortran.dg/c_ptr_tests.f03
new file mode 100644
index 00000000000..0b7c98be714
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/c_ptr_tests.f03
@@ -0,0 +1,44 @@
+! { dg-do run }
+! { dg-additional-sources c_ptr_tests_driver.c }
+module c_ptr_tests
+ use, intrinsic :: iso_c_binding
+
+ ! TODO::
+ ! in order to be associated with a C address,
+ ! the derived type needs to be C interoperable,
+ ! which requires bind(c) and all fields interoperable.
+ type, bind(c) :: myType
+ type(c_ptr) :: myServices
+ type(c_funptr) :: mySetServices
+ type(c_ptr) :: myPort
+ end type myType
+
+ type, bind(c) :: f90Services
+ integer(c_int) :: compId
+ type(c_ptr) :: globalServices = c_null_ptr
+ end type f90Services
+
+ contains
+
+ subroutine sub0(c_self, services) bind(c)
+ use, intrinsic :: iso_c_binding
+ implicit none
+ type(c_ptr), value :: c_self, services
+ type(myType), pointer :: self
+ type(f90Services), pointer :: localServices
+! type(c_ptr) :: my_cptr
+ type(c_ptr), save :: my_cptr = c_null_ptr
+
+ call c_f_pointer(c_self, self)
+ if(.not. associated(self)) then
+ print *, 'self is not associated'
+ end if
+ self%myServices = services
+
+ ! c_null_ptr is defined in iso_c_binding
+ my_cptr = c_null_ptr
+
+ ! get access to the local services obj from C
+ call c_f_pointer(self%myServices, localServices)
+ end subroutine sub0
+end module c_ptr_tests