- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
This small code snippet uses a slice of an array as an output argument to subroutine. In this subroutine, a pointer is set to the array, and a loop performed over its bounds.
program check_bounds implicit none integer, parameter :: n = 10, m1 = 5, m2 = 6 integer, dimension(:,:), allocatable :: arr integer :: i allocate (arr (n, n)) arr = 0 call return_array (n, m1, m2, arr(:,m1:m2)) contains subroutine return_array (n, m1, m2, arr) integer, intent(in) :: n, m1, m2 integer, dimension(:,m1:), intent(out), target :: arr integer :: i, j integer, dimension(:,:), pointer :: arrp print *, 'size of arr: ', size(arr,dim=1), size(arr,dim=2) !!! This works fine !do i = 1, n ! do j = m1, m2 ! arr(i,j) = i+j ! end do !end do arrp => arr print *, 'size of arrp: ', size(arrp,dim=1), size(arrp,dim=2) do i = 1, n do j = m1, m2 arrp(i,j) = i+j end do end do end subroutine return_array end program check_bounds
When compiled without any options, the whole code runs fine. However, when using "-check bounds", the program crashes with the error message
forrtl: severe (408): fort: (2): Subscript #2 of the array ARRP has value 5 which is greater than the upper bound of 2
It seems that the correct array bounds are not transferred to the bound checking instance.
As a side remark, the program compiled with gfortran works well with the corresponding option.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'll suggest you submit a support request at the Intel Online Service Center and include "regression in compiler 18" in your title and/or description.
https://supporttickets.intel.com/?lang=en-US
Here's a simpler example you can use as well and see what -check:bounds option does to LBOUND of arrp following pointer assignment; try the case without -check:bounds to see the difference.
program p integer :: a(1) call sub( 3, a ) contains subroutine sub( n, arr ) integer, intent(in) :: n integer, intent(inout), target :: arr(n:) integer, pointer :: parr(:) parr => arr print *, "lbound(arr): ", lbound(arr) print *, "lbound(parr): ", lbound(parr) end subroutine end program
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I forgot to mention the compiler version: 18.0.0
In fact, this seems to be a regression, as the example works well for ifort 17.0.4 and 16.0.2.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'll suggest you submit a support request at the Intel Online Service Center and include "regression in compiler 18" in your title and/or description.
https://supporttickets.intel.com/?lang=en-US
Here's a simpler example you can use as well and see what -check:bounds option does to LBOUND of arrp following pointer assignment; try the case without -check:bounds to see the difference.
program p integer :: a(1) call sub( 3, a ) contains subroutine sub( n, arr ) integer, intent(in) :: n integer, intent(inout), target :: arr(n:) integer, pointer :: parr(:) parr => arr print *, "lbound(arr): ", lbound(arr) print *, "lbound(parr): ", lbound(parr) end subroutine end program
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thank you for clarifying what actually goes wrong here. And also for pointing out where I can submit bug reports.

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page