Compare commits
1 Commits
8e78f0c8cd
...
main
| Author | SHA1 | Date |
|---|---|---|
|
|
594249c1e1 | 4 years ago |
@ -0,0 +1,91 @@
|
||||
!> Reproducer for bug in ifx related to using bounds when associating a pointer
|
||||
! to a function result.
|
||||
module test_m
|
||||
|
||||
contains
|
||||
subroutine printAddress(s, a)
|
||||
character(len=*), intent(in) :: s
|
||||
complex, dimension(*), intent(in), target :: a
|
||||
|
||||
write(*,"(A,' & 0x',Z0)") s, loc(a)
|
||||
end subroutine printAddress
|
||||
end module test_m
|
||||
|
||||
module reg_storage_m
|
||||
type, public :: reg_storage_t
|
||||
integer :: n_elements
|
||||
complex, dimension(:), allocatable :: alloc
|
||||
contains
|
||||
procedure :: malloc
|
||||
procedure :: free
|
||||
procedure :: get_1D_ptr
|
||||
procedure :: get_4D_ptr
|
||||
end type reg_storage_t
|
||||
contains
|
||||
subroutine malloc(this, n)
|
||||
class(reg_storage_t) :: this
|
||||
integer, intent(in) :: n
|
||||
|
||||
allocate(this%alloc(n))
|
||||
end subroutine malloc
|
||||
|
||||
subroutine free(this)
|
||||
class(reg_storage_t) :: this
|
||||
deallocate(this%alloc)
|
||||
end subroutine free
|
||||
|
||||
function get_1D_ptr(this)
|
||||
class(reg_storage_t), target :: this
|
||||
complex, dimension(:), pointer, contiguous :: get_1D_ptr
|
||||
|
||||
get_1D_ptr => this%alloc
|
||||
end function get_1D_ptr
|
||||
|
||||
function get_4D_ptr(this, l1, u1, l2, u2, l3, u3, l4, u4)
|
||||
class(reg_storage_t), target :: this
|
||||
integer :: l1, u1, l2, u2, l3, u3, l4, u4
|
||||
complex, dimension(:,:,:,:), pointer, contiguous :: get_4D_ptr
|
||||
|
||||
get_4D_ptr(l1:u1, l2:u2, l3:u3, l4:u4) => this%alloc
|
||||
end function get_4D_ptr
|
||||
end module reg_storage_m
|
||||
|
||||
program test
|
||||
use test_m
|
||||
use reg_storage_m
|
||||
implicit none
|
||||
|
||||
class(reg_storage_t), allocatable, target :: reg_stor
|
||||
complex, dimension(:,:,:,:), pointer, contiguous :: p
|
||||
complex, dimension(:), pointer, contiguous :: p_flat
|
||||
complex, dimension(:), pointer, contiguous :: p_flat_nobounds
|
||||
|
||||
integer :: lb, ub
|
||||
|
||||
lb = 1
|
||||
ub = lb+10240-1
|
||||
|
||||
allocate(reg_stor)
|
||||
call reg_stor%malloc(10240)
|
||||
p => reg_stor%get_4D_ptr(0, 15, 0, 15, 1, 2, 1, 20)
|
||||
p_flat(lb:ub) => reg_stor%get_1D_ptr()
|
||||
p_flat_nobounds => reg_stor%get_1D_ptr()
|
||||
|
||||
if (loc(p) /= loc(p_flat)) then
|
||||
print*,'ERROR: not same address'
|
||||
call exit(1)
|
||||
else
|
||||
print*,'OK'
|
||||
call exit(0)
|
||||
end if
|
||||
|
||||
call printAddress("p ", p)
|
||||
call printAddress("p slice 1", p(:,:,:,1))
|
||||
call printAddress("p slice 2", p(:,:,:,2))
|
||||
call printAddress("p_flat ", p_flat)
|
||||
call printAddress("p_flat slice 1", p_flat(lb:))
|
||||
call printAddress("p_flat slice 2", p_flat(lb+10240/20:))
|
||||
call printAddress("p_flat nb ", p_flat_nobounds)
|
||||
call printAddress("p_flat nb slice 1", p_flat_nobounds(lb:))
|
||||
call printAddress("p_flat nb slice 2", p_flat_nobounds(lb+10240/20:))
|
||||
end program test
|
||||
@ -1,32 +0,0 @@
|
||||
module reg_storage_m
|
||||
type, public :: reg_storage_t
|
||||
integer :: n_elements
|
||||
complex, dimension(:), allocatable :: alloc
|
||||
contains
|
||||
procedure :: malloc
|
||||
procedure :: free
|
||||
procedure :: get_4D_ptr
|
||||
end type reg_storage_t
|
||||
contains
|
||||
subroutine malloc(this, n)
|
||||
class(reg_storage_t) :: this
|
||||
integer, intent(in) :: n
|
||||
|
||||
allocate(this%alloc(n))
|
||||
end subroutine malloc
|
||||
|
||||
subroutine free(this)
|
||||
class(reg_storage_t) :: this
|
||||
deallocate(this%alloc)
|
||||
end subroutine free
|
||||
|
||||
function get_4D_ptr(this, l1, u1, l2, u2, l3, u3, l4, u4)
|
||||
class(reg_storage_t), target :: this
|
||||
integer :: l1, u1, l2, u2, l3, u3, l4, u4
|
||||
complex, dimension(:,:,:,:), pointer, contiguous :: get_4D_ptr
|
||||
|
||||
get_4D_ptr(l1:u1, l2:u2, l3:u3, l4:u4) => this%alloc
|
||||
end function get_4D_ptr
|
||||
end module reg_storage_m
|
||||
|
||||
|
||||
Loading…
Reference in new issue