1! Like char_result_5.f90, but the function arguments are pointers to scalars.
2! { dg-do run }
3pure function select (selector, iftrue, iffalse)
4  logical, intent (in) :: selector
5  integer, intent (in) :: iftrue, iffalse
6  integer :: select
7
8  if (selector) then
9    select = iftrue
10  else
11    select = iffalse
12  end if
13end function select
14
15program main
16  implicit none
17
18  interface
19    pure function select (selector, iftrue, iffalse)
20      logical, intent (in) :: selector
21      integer, intent (in) :: iftrue, iffalse
22      integer :: select
23    end function select
24  end interface
25
26  type pair
27    integer :: left, right
28  end type pair
29
30  integer, target :: i
31  integer, pointer :: ip
32  real, target :: r
33  real, pointer :: rp
34  logical, target :: l
35  logical, pointer :: lp
36  complex, target :: c
37  complex, pointer :: cp
38  character, target :: ch
39  character, pointer :: chp
40  type (pair), target :: p
41  type (pair), pointer :: pp
42
43  i = 100
44  r = 50.5
45  l = .true.
46  c = (10.9, 11.2)
47  ch = '1'
48  p%left = 40
49  p%right = 50
50
51  ip => i
52  rp => r
53  lp => l
54  cp => c
55  chp => ch
56  pp => p
57
58  call test (f1 (ip), 200)
59  call test (f2 (rp), 100)
60  call test (f3 (lp), 50)
61  call test (f4 (cp), 10)
62  call test (f5 (chp), 11)
63  call test (f6 (pp), 145)
64contains
65  function f1 (i)
66    integer, pointer :: i
67    character (len = abs (i) * 2) :: f1
68    f1 = ''
69  end function f1
70
71  function f2 (r)
72    real, pointer :: r
73    character (len = floor (r) * 2) :: f2
74    f2 = ''
75  end function f2
76
77  function f3 (l)
78    logical, pointer :: l
79    character (len = select (l, 50, 55)) :: f3
80    f3 = ''
81  end function f3
82
83  function f4 (c)
84    complex, pointer :: c
85    character (len = int (c)) :: f4
86    f4 = ''
87  end function f4
88
89  function f5 (c)
90    character, pointer :: c
91    character (len = scan ('123456789', c) + 10) :: f5
92    f5 = ''
93  end function f5
94
95  function f6 (p)
96    type (pair), pointer :: p
97    integer :: i
98    character (len = sum ((/ p%left, p%right, (i, i = 1, 10) /))) :: f6
99    f6 = ''
100  end function f6
101
102  subroutine test (string, length)
103    character (len = *) :: string
104    integer, intent (in) :: length
105    if (len (string) .ne. length) STOP 1
106  end subroutine test
107end program main
108