view gcc/testsuite/gfortran.dg/optional_absent_4.f90 @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents 1830386684a0
children
line wrap: on
line source

! { dg-do run }
! PR 82995 - segfault passing on an optional argument;
! this tests the inline versions.
module y
  implicit none
contains 

  function sum_1 (input, mask)
    logical, intent(in), optional :: mask(:)
    integer, intent(in) :: input(:)
    integer :: sum_1
    sum_1 = sum (input, mask)
  end function sum_1

  function sum_2 (input, mask)
    logical, intent(in), optional :: mask
    integer, intent(in) :: input(:)
    integer :: sum_2
    sum_2 = sum(input, mask)
  end function sum_2

  function sum_3 (input, mask)
    logical, intent(in), optional :: mask(:,:)
    integer, intent(in) :: input(:,:)
    integer :: sum_3
    sum_3 = sum (input, mask)
  end function sum_3

  function minval_1 (input, mask)
    logical, intent(in), optional :: mask(:,:)
    real, intent(in) :: input(:,:)
    real :: minval_1
    minval_1 = minval (input, mask)
  end function minval_1

  function maxval_1 (input, mask)
    logical, intent(in), optional :: mask
    real, intent(in) :: input(:,:)
    real :: maxval_1
    maxval_1 = maxval (input, mask)
  end function maxval_1

  function maxloc_1 (input, mask)
    logical, intent(in), optional :: mask(:)
    real, intent(in) :: input(:)
    integer :: maxloc_1

    maxloc_1 = maxloc(input, dim=1, mask=mask)
  end function maxloc_1

  function findloc_1 (input, val, mask)
    logical, intent(in), optional :: mask (:)
    integer, intent(in) :: input(:)
    integer, intent(in) :: val
    integer :: findloc_1

    findloc_1 = findloc(input, val, dim=1, mask=mask)
  end function findloc_1

  function findloc_2 (input, val, mask)
    logical, intent(in), optional :: mask
    integer, intent(in) :: input(:)
    integer, intent(in) :: val
    integer :: findloc_2

    findloc_2 = findloc(input, val, dim=1, mask=mask)
  end function findloc_2

end module y

program test_sum_1 
  use y
  implicit none 
  integer :: input(5) = [1,2,4,8,16]
  integer :: i2(2,3) = reshape([1,2,4,8,16,32], [2,3])
  real :: r2(2,3) = reshape ([32.,16.,8.,4.,2.,1.], [2,3])
  real :: r1(6) = [2.,4.,8.,32.,1.,16.]
  integer :: res
  real :: rres
  res = sum_1(input) 
  if (res /= 31) stop 1
  res = sum_2 (input)
  if (res /= 31) stop 2
  res = sum_3 (i2)
  if (res /= 63) stop 3
  rres = minval_1 (r2)
  if (rres /= 1.0) stop 4
  rres = maxval_1 (r2)
  if (rres /= 32.) stop 5
  res = maxloc_1 (r1)
  if (res /= 4) stop 6
  res = findloc_1 (input, 8)
  if (res /= 4) stop 7
  res = findloc_2 (input, 2)
  if (res /= 2) stop 8
end program test_sum_1