1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
! { dg-do run }
! Tests the fix for PR31213, which exposed rather a lot of
! bugs - see the PR and the ChangeLog.
!
! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
!
module mykinds
implicit none
integer, parameter :: ik1 = selected_int_kind (2)
integer, parameter :: ik2 = selected_int_kind (4)
integer, parameter :: dp = selected_real_kind (15,300)
end module mykinds
module spec_xpr
use mykinds
implicit none
integer(ik2) c_size
contains
pure function tricky (str,ugly)
character(*), intent(in) :: str
integer(ik1) :: ia_ik1(len(str))
interface yoagly
pure function ugly(n)
use mykinds
implicit none
integer, intent(in) :: n
complex(dp) :: ugly(3*n+2)
end function ugly
end interface yoagly
logical :: la(size (yoagly (size (ia_ik1))))
integer :: i
character(tricky_helper ((/(.TRUE., i=1, size (la))/)) + c_size) :: tricky
tricky = transfer (yoagly (1), tricky)
end function tricky
pure function tricky_helper (lb)
logical, intent(in) :: lb(:)
integer :: tricky_helper
tricky_helper = 2 * size (lb) + 3
end function tricky_helper
end module spec_xpr
module xtra_fun
implicit none
contains
pure function butt_ugly(n)
use mykinds
implicit none
integer, intent(in) :: n
complex(dp) :: butt_ugly(3*n+2)
real(dp) pi, sq2
pi = 4 * atan (1.0_dp)
sq2 = sqrt (2.0_dp)
butt_ugly = cmplx (pi, sq2, dp)
end function butt_ugly
end module xtra_fun
program spec_test
use mykinds
use spec_xpr
use xtra_fun
implicit none
character(54) :: chr
c_size = 5
if (tricky ('Help me', butt_ugly) .ne. transfer (butt_ugly (1), chr)) call abort ()
end program spec_test
! { dg-final { cleanup-modules "mykinds spec_xpr xtra_fun" } }
|