Merge from mainline
[official-gcc.git] / libgomp / testsuite / libgomp.fortran / vla5.f90
blob5c889f9923aa6e2196adf6bc7745c9ddc1c1c646
1 ! { dg-do run }
3 call test
4 contains
5 subroutine check (x, y, l)
6 integer :: x, y
7 logical :: l
8 l = l .or. x .ne. y
9 end subroutine check
11 subroutine foo (c, d, e, f, g, h, i, j, k, n)
12 use omp_lib
13 integer :: n
14 character (len = *) :: c
15 character (len = n) :: d
16 integer, dimension (2, 3:5, n) :: e
17 integer, dimension (2, 3:n, n) :: f
18 character (len = *), dimension (5, 3:n) :: g
19 character (len = n), dimension (5, 3:n) :: h
20 real, dimension (:, :, :) :: i
21 double precision, dimension (3:, 5:, 7:) :: j
22 integer, dimension (:, :, :) :: k
23 logical :: l
24 integer :: p, q, r
25 character (len = n) :: s
26 integer, dimension (2, 3:5, n) :: t
27 integer, dimension (2, 3:n, n) :: u
28 character (len = n), dimension (5, 3:n) :: v
29 character (len = 2 * n + 24) :: w
30 integer :: x, z, z2
31 character (len = 1) :: y
32 s = 'PQRSTUV'
33 forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + p - q + 2 * r
34 forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - p + q - 2 * r
35 forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = '_+|/Oo_'
36 forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = '///|||!'
37 l = .false.
38 call omp_set_dynamic (.false.)
39 call omp_set_num_threads (6)
40 !$omp parallel do default (none) lastprivate (c, d, e, f, g, h, i, j, k) &
41 !$omp & lastprivate (s, t, u, v) reduction (.or.:l) num_threads (6) &
42 !$omp private (p, q, r, w, x, y) schedule (static) shared (z2)
43 do 110 z = 0, omp_get_num_threads () - 1
44 if (omp_get_thread_num () .eq. 0) z2 = omp_get_num_threads ()
45 x = omp_get_thread_num ()
46 w = ''
47 if (x .eq. 0) w = 'thread0thr_number_0THREAD0THR_NUMBER_0'
48 if (x .eq. 1) w = 'thread1thr_number_1THREAD1THR_NUMBER_1'
49 if (x .eq. 2) w = 'thread2thr_number_2THREAD2THR_NUMBER_2'
50 if (x .eq. 3) w = 'thread3thr_number_3THREAD3THR_NUMBER_3'
51 if (x .eq. 4) w = 'thread4thr_number_4THREAD4THR_NUMBER_4'
52 if (x .eq. 5) w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
53 c = w(8:19)
54 d = w(1:7)
55 forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 * x + p + q + 2 * r
56 forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 * x + p + q + 2 * r
57 forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = w(8:19)
58 forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = w(27:38)
59 forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = w(1:7)
60 forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = w(20:26)
61 forall (p = 3:5, q = 2:6, r = 1:7) i(p - 2, q - 1, r) = (7.5 + x) * p * q * r
62 forall (p = 3:5, q = 2:6, r = 1:7) j(p, q + 3, r + 6) = (9.5 + x) * p * q * r
63 forall (p = 1:5, q = 7:7, r = 4:6) k(p, q - 6, r - 3) = 19 + x + p + q + 3 * r
64 s = w(20:26)
65 forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + x + p - q + 2 * r
66 forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - x - p + q - 2 * r
67 forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = w(1:7)
68 forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = w(20:26)
69 !$omp barrier
70 y = ''
71 if (x .eq. 0) y = '0'
72 if (x .eq. 1) y = '1'
73 if (x .eq. 2) y = '2'
74 if (x .eq. 3) y = '3'
75 if (x .eq. 4) y = '4'
76 if (x .eq. 5) y = '5'
77 l = l .or. w(7:7) .ne. y
78 l = l .or. w(19:19) .ne. y
79 l = l .or. w(26:26) .ne. y
80 l = l .or. w(38:38) .ne. y
81 l = l .or. c .ne. w(8:19)
82 l = l .or. d .ne. w(1:7)
83 l = l .or. s .ne. w(20:26)
84 do 103, p = 1, 2
85 do 103, q = 3, 7
86 do 103, r = 1, 7
87 if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
88 l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
89 if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
90 if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
91 if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
92 if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
93 if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
94 l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
95 if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
96 if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
97 103 continue
98 do 104, p = 3, 5
99 do 104, q = 2, 6
100 do 104, r = 1, 7
101 l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
102 l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
103 104 continue
104 do 105, p = 1, 5
105 do 105, q = 4, 6
106 l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
107 105 continue
108 call check (size (e, 1), 2, l)
109 call check (size (e, 2), 3, l)
110 call check (size (e, 3), 7, l)
111 call check (size (e), 42, l)
112 call check (size (f, 1), 2, l)
113 call check (size (f, 2), 5, l)
114 call check (size (f, 3), 7, l)
115 call check (size (f), 70, l)
116 call check (size (g, 1), 5, l)
117 call check (size (g, 2), 5, l)
118 call check (size (g), 25, l)
119 call check (size (h, 1), 5, l)
120 call check (size (h, 2), 5, l)
121 call check (size (h), 25, l)
122 call check (size (i, 1), 3, l)
123 call check (size (i, 2), 5, l)
124 call check (size (i, 3), 7, l)
125 call check (size (i), 105, l)
126 call check (size (j, 1), 4, l)
127 call check (size (j, 2), 5, l)
128 call check (size (j, 3), 7, l)
129 call check (size (j), 140, l)
130 call check (size (k, 1), 5, l)
131 call check (size (k, 2), 1, l)
132 call check (size (k, 3), 3, l)
133 call check (size (k), 15, l)
134 110 continue
135 !$omp end parallel do
136 if (l) call abort
137 if (z2 == 6) then
138 x = 5
139 w = 'thread5thr_number_5THREAD5THR_NUMBER_5'
140 y = '5'
141 l = l .or. w(7:7) .ne. y
142 l = l .or. w(19:19) .ne. y
143 l = l .or. w(26:26) .ne. y
144 l = l .or. w(38:38) .ne. y
145 l = l .or. c .ne. w(8:19)
146 l = l .or. d .ne. w(1:7)
147 l = l .or. s .ne. w(20:26)
148 do 113, p = 1, 2
149 do 113, q = 3, 7
150 do 113, r = 1, 7
151 if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 * x + p + q + 2 * r
152 l = l .or. f(p, q, r) .ne. 25 * x + p + q + 2 * r
153 if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. w(8:19)
154 if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. w(27:38)
155 if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. w(1:7)
156 if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. w(20:26)
157 if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + x + p - q + 2 * r
158 l = l .or. u(p, q, r) .ne. 30 - x - p + q - 2 * r
159 if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. w(1:7)
160 if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. w(20:26)
161 113 continue
162 do 114, p = 3, 5
163 do 114, q = 2, 6
164 do 114, r = 1, 7
165 l = l .or. i(p - 2, q - 1, r) .ne. (7.5 + x) * p * q * r
166 l = l .or. j(p, q + 3, r + 6) .ne. (9.5 + x) * p * q * r
167 114 continue
168 do 115, p = 1, 5
169 do 115, q = 4, 6
170 l = l .or. k(p, 1, q - 3) .ne. 19 + x + p + 7 + 3 * q
171 115 continue
172 if (l) call abort
173 end if
174 end subroutine foo
176 subroutine test
177 character (len = 12) :: c
178 character (len = 7) :: d
179 integer, dimension (2, 3:5, 7) :: e
180 integer, dimension (2, 3:7, 7) :: f
181 character (len = 12), dimension (5, 3:7) :: g
182 character (len = 7), dimension (5, 3:7) :: h
183 real, dimension (3:5, 2:6, 1:7) :: i
184 double precision, dimension (3:6, 2:6, 1:7) :: j
185 integer, dimension (1:5, 7:7, 4:6) :: k
186 integer :: p, q, r
187 c = 'abcdefghijkl'
188 d = 'ABCDEFG'
189 forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 + p + q + 2 * r
190 forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 + p + q + 2 * r
191 forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = '0123456789AB'
192 forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = '9876543210ZY'
193 forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = '0123456'
194 forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = '9876543'
195 forall (p = 3:5, q = 2:6, r = 1:7) i(p, q, r) = 7.5 * p * q * r
196 forall (p = 3:6, q = 2:6, r = 1:7) j(p, q, r) = 9.5 * p * q * r
197 forall (p = 1:5, q = 7:7, r = 4:6) k(p, q, r) = 19 + p + q + 3 * r
198 call foo (c, d, e, f, g, h, i, j, k, 7)
199 end subroutine test