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