(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
zero_sized_15.f90
! { dg-do run }
! PR fortran/86277
!
! Check proper detection of presence of optional array dummy arguments
! for zero-sized actual array arguments or array constructors:
! tests for CHARACTER

program test
  implicit none
  character(0), parameter   :: c0(0) = ""
  character(0), parameter   :: c1(1) = ""
  character(1), parameter   :: d0(0) = ""
  character(1), parameter   :: d1(1) = ""
  character(0)              :: w0(0)
  character(0)              :: w1(1)
  character(:), allocatable :: cc(:)
  integer                   :: k = 0, l = 0     ! Test/failure counter
  !
  allocate (character(0) :: cc(0))
  call a0 ()
  call a1 ()
  call a2 ()
  call a3 ()
  print *, "Total tests:", k, " failed:", l
contains
  subroutine a0 ()
    print *, "Variables as actual argument"
    call i  (c0)
    call i  (c1)
    call i  (d0)
    call i  (d1)
    call i  (w0)
    call i  (w1)
    call i  (cc)
    print *, "Array section as actual argument"
    call i  (c1(1:0))
    call i  (c1(1:0)(1:0))
    call i  (w1(1:0))
    call i  (w1(1:0)(1:0))
    call i  (cc(1:0))
    call i  (cc(1:0)(1:0))
  end subroutine a0
  !
  subroutine a1 ()
    print *, "Explicit temporary as actual argument"
    call i ((c0))
    call i ((c1))
    call i ((d0))
    call i ((d1))
    call i ((w0))
    call i ((w1))
    call i ((cc))
    call i ((c1(1:0)))
    call i ((c1(1:0)(1:0)))
    call i ((w1(1:0)))
    call i ((w1(1:0)(1:0)))
    call i ((cc(1:0)))
    call i ((cc(1:0)(1:0)))
  end subroutine a1
  !
  subroutine a2 ()
    print *, "Array constructor as actual argument"
    call i ([c0])
    call i ([c1])
    call i ([d0])
    call i ([d1])
    call i ([w0])
    call i ([w1])
    call i ([cc])
    call i ([c0,c0])
    call i ([c1,c1])
    call i ([d0,d0])
    call i ([cc,cc])
    call i ([c1(1:0)])
    call i ([c1(1:0)(1:0)])
    call i ([w1(1:0)])
    call i ([w1(1:0)(1:0)])
    call i ([cc(1:0)])
    call i ([cc(1:0)(1:0)])
  end subroutine a2
  !
  subroutine a3 ()
    print *, "Array constructor with type-spec as actual argument"
    call i ([character(0) ::   ])
    call i ([character(0) :: ""])
    call i ([character(0) :: c0])
    call i ([character(0) :: c1])
    call i ([character(0) :: d0])
    call i ([character(0) :: d1])
    call i ([character(0) :: w0])
    call i ([character(0) :: w1])
    call i ([character(0) :: cc])
    call i ([character(0) :: c0,c0])
    call i ([character(0) :: c1,c1])
    call i ([character(0) :: d0,d0])
    call i ([character(0) :: cc,cc])
    call i ([character(0) :: c1(1:0)])
    call i ([character(0) :: c1(1:0)(1:0)])
    call i ([character(0) :: w1(1:0)])
    call i ([character(0) :: w1(1:0)(1:0)])
    call i ([character(0) :: cc(1:0)])
    call i ([character(0) :: cc(1:0)(1:0)])
  end subroutine a3
  !
  subroutine i(arg)
    character(*), optional, intent(in) :: arg(:)
    logical :: t
    t = present (arg)
    k = k + 1
    print *, 'test', k, merge ("  ok", "FAIL", t)
    if (.not. t) l = l + 1
    if (.not. t) stop k
  end subroutine i
end program