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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
! { dg-do run }
! Test the fix for PR34438, in which default initializers
! forced the derived type to be static; ie. initialized once
! during the lifetime of the programme. Instead, they should
! be initialized each time they come into scope.
!
! Contributed by Sven Buijssen <sven.buijssen@math.uni-dortmund.de>
! Third test is from Dominique Dhumieres <dominiq@lps.ens.fr>
!
module demo
type myint
integer :: bar = 42
end type myint
end module demo
! As the name implies, this was the original testcase
! provided by the contributor....
subroutine original
use demo
integer val1 (6)
integer val2 (6)
call recfunc (1)
if (any (val1 .ne. (/1, 2, 3, 1, 2, 3/))) call abort ()
if (any (val2 .ne. (/1, 2, 3, 4, 4, 4/))) call abort ()
contains
recursive subroutine recfunc (ivalue)
integer, intent(in) :: ivalue
type(myint) :: foo1
type(myint) :: foo2 = myint (99)
foo1%bar = ivalue
foo2%bar = ivalue
if (ivalue .le. 3) then
val1(ivalue) = foo1%bar
val2(ivalue) = foo2%bar
call recfunc (ivalue + 1)
val1(ivalue + 3) = foo1%bar
val2(ivalue + 3) = foo2%bar
endif
end subroutine recfunc
end subroutine original
! ...who came up with this one too.
subroutine func (ivalue, retval1, retval2)
use demo
integer, intent(in) :: ivalue
type(myint) :: foo1
type(myint) :: foo2 = myint (77)
type(myint) :: retval1
type(myint) :: retval2
retval1 = foo1
retval2 = foo2
foo1%bar = 999
foo2%bar = 999
end subroutine func
subroutine other
use demo
interface
subroutine func(ivalue, rv1, rv2)
use demo
integer, intent(in) :: ivalue
type(myint) :: foo, rv1, rv2
end subroutine func
end interface
type(myint) :: val1, val2
call func (1, val1, val2)
if ((val1%bar .ne. 42) .or. (val2%bar .ne. 77)) call abort ()
call func (2, val1, val2)
if ((val1%bar .ne. 42) .or. (val2%bar .ne. 999)) call abort ()
end subroutine other
MODULE M1
TYPE T1
INTEGER :: i=7
END TYPE T1
CONTAINS
FUNCTION F1(d1) RESULT(res)
INTEGER :: res
TYPE(T1), INTENT(OUT) :: d1
TYPE(T1), INTENT(INOUT) :: d2
res=d1%i
d1%i=0
RETURN
ENTRY E1(d2) RESULT(res)
res=d2%i
d2%i=0
END FUNCTION F1
END MODULE M1
! This tests the fix of a regression caused by the first version
! of the patch.
subroutine dominique ()
USE M1
TYPE(T1) :: D1
D1=T1(3)
if (F1(D1) .ne. 7) call abort ()
D1=T1(3)
if (E1(D1) .ne. 3) call abort ()
END
! Run both tests.
call original
call other
call dominique
end
! { dg-final { cleanup-modules "demo M1" } }
|