1! { dg-do run }
2! Test the fix for PR26891, in which an optional argument, whose actual
3! is a missing dummy argument would cause a segfault.
4!
5! Contributed by Paul Thomas  <pault@gcc.gnu.org>
6!
7  logical :: back =.false.
8
9! This was the case that would fail - PR case was an intrinsic call.
10  if (scan ("A quick brown fox jumps over the lazy dog", "lazy", back) &
11      .ne. myscan ("A quick brown fox jumps over the lazy dog", "lazy")) &
12    call abort ()
13
14! Check that the patch works with non-intrinsic functions.
15  if (myscan ("A quick brown fox jumps over the lazy dog", "fox", back) &
16      .ne. thyscan ("A quick brown fox jumps over the lazy dog", "fox")) &
17    call abort ()
18
19! Check that missing, optional character actual arguments are OK.
20  if (scan ("A quick brown fox jumps over the lazy dog", "over", back) &
21      .ne. thyscan ("A quick brown fox jumps over the lazy dog")) &
22    call abort ()
23
24contains
25  integer function myscan (str, substr, back)
26    character(*), intent(in) :: str, substr
27    logical, optional, intent(in) :: back
28    myscan = scan (str, substr, back)
29  end function myscan
30
31  integer function thyscan (str, substr, back)
32    character(*), intent(in) :: str
33    character(*), optional, intent(in) :: substr
34    logical, optional, intent(in) :: back
35    thyscan = isscan (str, substr, back)
36  end function thyscan
37
38  integer function isscan (str, substr, back)
39    character(*), intent(in) :: str
40    character(*), optional :: substr
41    logical, optional, intent(in) :: back
42    if (.not.present(substr)) then
43      isscan = myscan (str, "over", back)
44    else
45      isscan = myscan (str, substr, back)
46    end if
47  end function isscan
48
49end
50