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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
! RUN: %S/test_errors.sh %s %t %f18
! Check for semantic errors in ALLOCATE statements
!TODO: mixing expr and source-expr?
!TODO: using subcomponent in source expressions
subroutine C939_C942a_C945b(xsrc1a, xsrc1c, xsrc0, xsrc2a, xsrc2c, pos)
! C939: If an allocate-object is an array, either allocate-shape-spec-list shall
! appear in its allocation, or source-expr shall appear in the ALLOCATE
! statement and have the same rank as the allocate-object.
type A
real, pointer :: x(:)
end type
real, allocatable :: x0
real, allocatable :: x1(:)
real, pointer :: x2(:, :, :)
type(A) a1
type(A), allocatable :: a2(:, :)
real xsrc0
real xsrc1a(*)
real xsrc1b(2:7)
real, pointer :: xsrc1c(:)
real xsrc2a(4:8, 12, *)
real xsrc2b(2:7, 5, 9)
real, pointer :: xsrc2c(:, :, :)
integer pos
allocate(x1(5))
allocate(x1(2:7))
allocate(x1, SOURCE=xsrc1a(2:7))
allocate(x1, MOLD=xsrc1b)
allocate(x1, SOURCE=xsrc1c)
allocate(x2(2,3,4))
allocate(x2(2:7,3:8,4:9))
allocate(x2, SOURCE=xsrc2a(4:8, 1:12, 2:5))
allocate(x2, MOLD=cos(xsrc2b))
allocate(x2, SOURCE=xsrc2c)
allocate(x1(5), x2(2,3,4), a1%x(5), a2(1,2)%x(4))
allocate(x1, a1%x, a2(1,2)%x, SOURCE=xsrc1a(2:7))
allocate(x1, a1%x, a2(1,2)%x, MOLD=xsrc1b)
allocate(x1, a1%x, a2(1,2)%x, SOURCE=xsrc1c)
allocate(x0, x1(5), x2(2,3,4), a1%x(5), SOURCE=xsrc0)
! There are NO requirements that mold expression rank match the
! allocated-objects when allocate-shape-spec-lists are given.
! If it is not needed, the shape of MOLD should be simply ignored.
allocate(x0, x1(5), x2(2,3,4), a1%x(5), MOLD=xsrc0)
allocate(x0, x1(5), x2(2,3,4), a1%x(5), MOLD=xsrc1b)
allocate(x0, x1(5), x2(2,3,4), a1%x(5), MOLD=xsrc2b)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x1)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x1, SOURCE=xsrc0)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x1, MOLD=xsrc2c)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x2, SOURCE=xsrc1a(2:7))
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x2, MOLD=xsrc1b)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x2, SOURCE=xsrc1c)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(a1%x)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(a2(5,3)%x)
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x1(5), x2(2,3,4), a1%x, a2(1,2)%x(4))
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(x2, a2(1,2)%x, SOURCE=xsrc2a(4:8, 1:12, 2:5))
!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
allocate(a1%x, MOLD=xsrc0)
!C942a: The number of allocate-shape-specs in an allocate-shape-spec-list shall
!be the same as the rank of the allocate-object. [...] (co-array stuffs).
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x1(5, 5))
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x1(2:3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2))
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x2(pos))
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x2(2, 3, pos+1, 5))
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x1(5), x2(2,4), a1%x(5), a2(1,2)%x(4))
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x1(2), a1%x(2,5), a2(1,2)%x(2))
! Test the check is not influenced by SOURCE
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(a1%x(5, 4, 3), SOURCE=xsrc2a(1:5, 1:4, 1:3))
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x2(5), MOLD=xsrc1a(1:5))
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(a1%x(5, 4, 3), MOLD=xsrc1b)
!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object
allocate(x2(5), SOURCE=xsrc2b)
! C945b: If SOURCE= appears, source-expr shall be a scalar or have the same
! rank as each allocate-object.
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(x0, SOURCE=xsrc1b)
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(x2(2, 5, 7), SOURCE=xsrc1a(2:7))
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(x2(2, 5, 7), SOURCE=xsrc1c)
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(x1(5), SOURCE=xsrc2a(4:8, 1:12, 2:5))
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(x1(3), SOURCE=cos(xsrc2b))
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(x1(100), SOURCE=xsrc2c)
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(a1%x(10), x2(20, 30, 40), a2(1,2)%x(50), SOURCE=xsrc1c)
!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
allocate(a1%x(25), SOURCE=xsrc2b)
end subroutine
subroutine C940(a1, pos)
! If allocate-object is scalar, allocate-shape-spec-list shall not appear.
type A
integer(kind=8), allocatable :: i
end type
type B(k, l1, l2, l3)
integer, kind :: k
integer, len :: l1, l2, l3
real(kind=k) x(-1:l1, 0:l2, 1:l3)
end type
integer pos
class(A), allocatable :: a1(:)
real, pointer :: x
type(B(8,4,5,6)), allocatable :: b1
! Nominal
allocate(x)
allocate(a1(pos)%i)
allocate(b1)
!ERROR: Shape specifications must not appear when allocatable object is scalar
allocate(x(pos))
!ERROR: Shape specifications must not appear when allocatable object is scalar
allocate(a1(pos)%i(5:2))
!ERROR: Shape specifications must not appear when allocatable object is scalar
allocate(b1(1))
end subroutine
|