blob: 8bbdc95c6cdbc98b14cc0b40beb2df022c45f552 [file] [log] [blame]
! { dg-do run }
! PR fortran/113866
!
! Check interoperability of assumed-length character (optional and
! non-optional) dummies between bind(c) and non-bind(c) procedures
module bindcchar
implicit none
integer, parameter :: n = 100, l = 10
contains
subroutine bindc_optional (c2, c4) bind(c)
character(*), optional :: c2, c4(n)
! print *, c2(1:3)
! print *, c4(5)(1:3)
if (.not. present (c2) .or. .not. present (c4)) stop 8
if (len (c2) /= l .or. len (c4) /= l) stop 81
if (c2(1:3) /= "a23") stop 1
if (c4(5)(1:3) /= "bcd") stop 2
end
subroutine bindc (c2, c4) bind(c)
character(*) :: c2, c4(n)
if (len (c2) /= l .or. len (c4) /= l) stop 82
if (c2(1:3) /= "a23") stop 3
if (c4(5)(1:3) /= "bcd") stop 4
call bindc_optional (c2, c4)
end
subroutine not_bindc_optional (c1, c3)
character(*), optional :: c1, c3(n)
if (.not. present (c1) .or. .not. present (c3)) stop 5
if (len (c1) /= l .or. len (c3) /= l) stop 83
call bindc_optional (c1, c3)
call bindc (c1, c3)
end
subroutine not_bindc_optional_deferred (c5, c6)
character(:), allocatable, optional :: c5, c6(:)
if (.not. present (c5) .or. .not. present (c6)) stop 6
if (len (c5) /= l .or. len (c6) /= l) stop 84
call not_bindc_optional (c5, c6)
call bindc_optional (c5, c6)
call bindc (c5, c6)
end
subroutine not_bindc_optional2 (c7, c8)
character(*), optional :: c7, c8(:)
if (.not. present (c7) .or. .not. present (c8)) stop 7
if (len (c7) /= l .or. len (c8) /= l) stop 85
call bindc_optional (c7, c8)
call bindc (c7, c8)
end
subroutine bindc_optional2 (c2, c4) bind(c)
character(*), optional :: c2, c4(n)
if (.not. present (c2) .or. .not. present (c4)) stop 8
if (len (c2) /= l .or. len (c4) /= l) stop 86
if (c2(1:3) /= "a23") stop 9
if (c4(5)(1:3) /= "bcd") stop 10
call bindc_optional (c2, c4)
call not_bindc_optional (c2, c4)
end
subroutine bindc_optional_missing (c1, c2, c3, c4, c5) bind(c)
character(*), optional :: c1, c2(n), c3(:), c4(..), c5(*)
if (present (c1)) stop 11
if (present (c2)) stop 12
if (present (c3)) stop 13
if (present (c4)) stop 14
if (present (c5)) stop 15
end
subroutine non_bindc_optional_missing (c1, c2, c3, c4, c5)
character(*), optional :: c1, c2(n), c3(:), c4(..), c5(*)
if (present (c1)) stop 21
if (present (c2)) stop 22
if (present (c3)) stop 23
if (present (c4)) stop 24
if (present (c5)) stop 25
end
end module
program p
use bindcchar
implicit none
character(l) :: a, b(n)
character(:), allocatable :: d, e(:)
a = 'a234567890'
b = 'bcdefghijk'
call not_bindc_optional (a, b)
call bindc_optional (a, b)
call not_bindc_optional2 (a, b)
call bindc_optional2 (a, b)
allocate (d, source=a)
allocate (e, source=b)
call not_bindc_optional (d, e)
call bindc_optional (d, e)
call not_bindc_optional2 (d, e)
call bindc_optional2 (d, e)
call not_bindc_optional_deferred (d, e)
deallocate (d, e)
call non_bindc_optional_missing ()
call bindc_optional_missing ()
end