| ! { dg-do compile} |
| ! { dg-additional-options "-fcoarray=single" } |
| ! |
| ! TS 29113 |
| ! C535b An assumed-rank variable name shall not appear in a designator |
| ! or expression except as an actual argument corresponding to a dummy |
| ! argument that is assumed-rank, the argument of the C_LOC function |
| ! in the ISO_C_BINDING intrinsic module, or the first argument in a |
| ! reference to an intrinsic inquiry function. |
| ! |
| ! This has been renamed C838 in the Fortran 2018 standard, with C_SIZEOF |
| ! and SELECT_RANK additionally added. |
| ! |
| ! This test file contains tests that are expected to all pass. |
| |
| ! Check that passing an assumed-rank variable as an actual argument |
| ! corresponding to an assumed-rank dummy works. |
| |
| module m |
| interface |
| subroutine g (a, b) |
| implicit none |
| real :: a(..) |
| integer :: b |
| end subroutine |
| end interface |
| end module |
| |
| subroutine s0 (x) |
| use m |
| implicit none |
| real :: x(..) |
| |
| call g (x, 1) |
| end subroutine |
| |
| ! Check that calls to the permitted intrinsic functions work. |
| |
| function test_c_loc (a) |
| use iso_c_binding |
| implicit none |
| integer, target :: a(..) |
| type(c_ptr) :: test_c_loc |
| |
| test_c_loc = c_loc (a) |
| end function |
| |
| function test_allocated (a) |
| implicit none |
| integer, allocatable :: a(..) |
| logical :: test_allocated |
| |
| test_allocated = allocated (a) |
| end function |
| |
| ! 2-argument forms of the associated intrinsic are tested in c535b-3.f90. |
| function test_associated (a) |
| implicit none |
| integer, pointer :: a(..) |
| logical :: test_associated |
| |
| test_associated = associated (a) |
| end function |
| |
| function test_bit_size (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_bit_size |
| |
| test_bit_size = bit_size (a) |
| end function |
| |
| function test_digits (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_digits |
| |
| test_digits = digits (a) |
| end function |
| |
| function test_epsilon (a) |
| implicit none |
| real :: a(..) |
| real :: test_epsilon |
| |
| test_epsilon = epsilon (a) |
| end function |
| |
| function test_huge (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_huge |
| |
| test_huge = huge (a) |
| end function |
| |
| function test_is_contiguous (a) |
| implicit none |
| integer :: a(..) |
| logical :: test_is_contiguous |
| |
| test_is_contiguous = is_contiguous (a) |
| end function |
| |
| function test_kind (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_kind |
| |
| test_kind = kind (a) |
| end function |
| |
| function test_lbound (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_lbound |
| |
| test_lbound = lbound (a, 1) |
| end function |
| |
| function test_len1 (a) |
| implicit none |
| character(len=5) :: a(..) |
| integer :: test_len1 |
| |
| test_len1 = len (a) |
| end function |
| |
| function test_len2 (a) |
| implicit none |
| character(len=*) :: a(..) |
| integer :: test_len2 |
| |
| test_len2 = len (a) |
| end function |
| |
| function test_len3 (a) |
| implicit none |
| character(len=5), pointer :: a(..) |
| integer :: test_len3 |
| |
| test_len3 = len (a) |
| end function |
| |
| function test_len4 (a) |
| implicit none |
| character(len=*), pointer :: a(..) |
| integer :: test_len4 |
| |
| test_len4 = len (a) |
| end function |
| |
| function test_len5 (a) |
| implicit none |
| character(len=:), pointer :: a(..) |
| integer :: test_len5 |
| |
| test_len5 = len (a) |
| end function |
| |
| function test_len6 (a) |
| implicit none |
| character(len=5), allocatable :: a(..) |
| integer :: test_len6 |
| |
| test_len6 = len (a) |
| end function |
| |
| function test_len7 (a) |
| implicit none |
| character(len=*), allocatable :: a(..) |
| integer :: test_len7 |
| |
| test_len7 = len (a) |
| end function |
| |
| function test_len8 (a) |
| implicit none |
| character(len=:), allocatable :: a(..) |
| integer :: test_len8 |
| |
| test_len8 = len (a) |
| end function |
| |
| function test_maxexponent (a) |
| implicit none |
| real :: a(..) |
| integer :: test_maxexponent |
| |
| test_maxexponent = maxexponent (a) |
| end function |
| |
| function test_minexponent (a) |
| implicit none |
| real :: a(..) |
| integer :: test_minexponent |
| |
| test_minexponent = minexponent (a) |
| end function |
| |
| function test_new_line (a) |
| implicit none |
| character :: a(..) |
| character :: test_new_line |
| |
| test_new_line = new_line (a) |
| end function |
| |
| function test_precision (a) |
| implicit none |
| real :: a(..) |
| integer :: test_precision |
| |
| test_precision = precision (a) |
| end function |
| |
| function test_present (a, b, c) |
| implicit none |
| integer :: a, b |
| integer, optional :: c(..) |
| integer :: test_present |
| |
| if (present (c)) then |
| test_present = a |
| else |
| test_present = b |
| end if |
| end function |
| |
| function test_radix (a) |
| implicit none |
| real :: a(..) |
| integer :: test_radix |
| |
| test_radix = radix (a) |
| end function |
| |
| function test_range (a) |
| implicit none |
| real :: a(..) |
| integer :: test_range |
| |
| test_range = range (a) |
| end function |
| |
| function test_rank (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_rank |
| |
| test_rank = rank (a) |
| end function |
| |
| function test_shape (a) |
| implicit none |
| integer :: a(..) |
| logical :: test_shape |
| |
| test_shape = (rank (a) .eq. size (shape (a))) |
| end function |
| |
| function test_size (a) |
| implicit none |
| integer :: a(..) |
| logical :: test_size |
| |
| test_size = (size (a) .eq. product (shape (a))) |
| end function |
| |
| function test_storage_size (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_storage_size |
| |
| test_storage_size = storage_size (a) |
| end function |
| |
| function test_tiny (a) |
| implicit none |
| real :: a(..) |
| real :: test_tiny |
| |
| test_tiny = tiny (a) |
| end function |
| |
| function test_ubound (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_ubound |
| |
| test_ubound = ubound (a, 1) |
| end function |
| |
| ! Note: there are no tests for these inquiry functions that can't |
| ! take an assumed-rank array argument for other reasons: |
| ! |
| ! coshape, lcobound, ucobound: requires CODIMENSION attribute, which is |
| ! not permitted on an assumed-rank variable. |
| ! |
| |
| ! F2018 additionally permits the first arg to C_SIZEOF to be |
| ! assumed-rank (C838). |
| |
| function test_c_sizeof (a) |
| use iso_c_binding |
| implicit none |
| integer :: a(..) |
| integer :: test_c_sizeof |
| |
| test_c_sizeof = c_sizeof (a) |
| end function |
| |
| ! F2018 additionally permits an assumed-rank array as the selector |
| ! in a SELECT RANK construct (C838). |
| |
| function test_select_rank (a) |
| implicit none |
| integer :: a(..) |
| integer :: test_select_rank |
| |
| select rank (a) |
| rank (0) |
| test_select_rank = 0 |
| rank (1) |
| test_select_rank = 1 |
| rank (2) |
| test_select_rank = 2 |
| rank default |
| test_select_rank = -1 |
| end select |
| end function |