aboutsummaryrefslogtreecommitdiff
blob: 142e9d0eee6f20fa25ac28737a37d8b40014e340 (plain)
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