| ! { dg-do compile } |
| ! { dg-options "-fdump-tree-optimized -O" } |
| ! |
| ! PR fortran/46974 |
| |
| program test |
| use ISO_C_BINDING |
| implicit none |
| type(c_ptr) :: m |
| integer(c_intptr_t) :: a |
| integer(transfer(transfer(4_c_intptr_t, c_null_ptr),1_c_intptr_t)) :: b |
| a = transfer (transfer("ABCE", m), 1_c_intptr_t) |
| print '(z8)', a |
| if ( int(z'45434241') /= a & |
| .and. int(z'41424345') /= a & |
| .and. int(z'4142434500000000',kind=8) /= a) & |
| call i_do_not_exist() |
| end program test |
| |
| ! Examples contributed by Steve Kargl and James Van Buskirk |
| |
| subroutine bug1 |
| use ISO_C_BINDING |
| implicit none |
| type(c_ptr) :: m |
| type mytype |
| integer a, b, c |
| end type mytype |
| type(mytype) x |
| print *, transfer(32512, x) ! Works. |
| print *, transfer(32512, m) ! Caused ICE. |
| end subroutine bug1 |
| |
| subroutine bug6 |
| use ISO_C_BINDING |
| implicit none |
| interface |
| function fun() |
| use ISO_C_BINDING |
| implicit none |
| type(C_FUNPTR) fun |
| end function fun |
| end interface |
| type(C_PTR) array(2) |
| type(C_FUNPTR) result |
| integer(C_INTPTR_T), parameter :: const(*) = [32512,32520] |
| |
| result = fun() |
| array = transfer([integer(C_INTPTR_T)::32512,32520],array) |
| ! write(*,*) transfer(result,const) |
| ! write(*,*) transfer(array,const) |
| end subroutine bug6 |
| |
| function fun() |
| use ISO_C_BINDING |
| implicit none |
| type(C_FUNPTR) fun |
| fun = transfer(32512_C_INTPTR_T,fun) |
| end function fun |
| |
| ! { dg-final { scan-tree-dump-times "i_do_not_exist" 0 "optimized" } } |