1! { dg-do run }
2!$ use omp_lib
3
4  integer :: i, ia (6), n, cnt
5  real :: r, ra (4)
6  double precision :: d, da (5)
7  complex :: c, ca (3)
8  logical :: v
9
10  i = 1
11  ia = 2
12  r = 3
13  ra = 4
14  d = 5.5
15  da = 6.5
16  c = cmplx (7.5, 1.5)
17  ca = cmplx (8.5, -3.0)
18  v = .false.
19  cnt = -1
20
21!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
22!$omp & reduction (+:i, ia, r, ra, d, da, c, ca)
23!$ if (i .ne. 0 .or. any (ia .ne. 0)) v = .true.
24!$ if (r .ne. 0 .or. any (ra .ne. 0)) v = .true.
25!$ if (d .ne. 0 .or. any (da .ne. 0)) v = .true.
26!$ if (c .ne. cmplx (0) .or. any (ca .ne. cmplx (0))) v = .true.
27  n = omp_get_thread_num ()
28  if (n .eq. 0) then
29    cnt = omp_get_num_threads ()
30    i = 4
31    ia(3:5) = -2
32    r = 5
33    ra(1:2) = 6.5
34    d = -2.5
35    da(2:4) = 8.5
36    c = cmplx (2.5, -3.5)
37    ca(1) = cmplx (4.5, 5)
38  else if (n .eq. 1) then
39    i = 2
40    ia(4:6) = 5
41    r = 1
42    ra(2:4) = -1.5
43    d = 8.5
44    da(1:3) = 2.5
45    c = cmplx (0.5, -3)
46    ca(2:3) = cmplx (-1, 6)
47  else
48    i = 1
49    ia = 1
50    r = -1
51    ra = -1
52    d = 1
53    da = -1
54    c = 1
55    ca = cmplx (-1, 0)
56  end if
57!$omp end parallel
58  if (v) STOP 1
59  if (cnt .eq. 3) then
60    if (i .ne. 8 .or. any (ia .ne. (/3, 3, 1, 6, 6, 8/))) STOP 2
61    if (r .ne. 8 .or. any (ra .ne. (/9.5, 8.0, 1.5, 1.5/))) STOP 3
62    if (d .ne. 12.5 .or. any (da .ne. (/8.0, 16.5, 16.5, 14.0, 5.5/))) STOP 4
63    if (c .ne. cmplx (11.5, -5)) STOP 5
64    if (ca(1) .ne. cmplx (12, 2)) STOP 6
65    if (ca(2) .ne. cmplx (6.5, 3) .or. ca(2) .ne. ca(3)) STOP 7
66  end if
67
68  i = 1
69  ia = 2
70  r = 3
71  ra = 4
72  d = 5.5
73  da = 6.5
74  c = cmplx (7.5, 1.5)
75  ca = cmplx (8.5, -3.0)
76  v = .false.
77  cnt = -1
78
79!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
80!$omp & reduction (-:i, ia, r, ra, d, da, c, ca)
81!$ if (i .ne. 0 .or. any (ia .ne. 0)) v = .true.
82!$ if (r .ne. 0 .or. any (ra .ne. 0)) v = .true.
83!$ if (d .ne. 0 .or. any (da .ne. 0)) v = .true.
84!$ if (c .ne. cmplx (0) .or. any (ca .ne. cmplx (0))) v = .true.
85  n = omp_get_thread_num ()
86  if (n .eq. 0) then
87    cnt = omp_get_num_threads ()
88    i = 4
89    ia(3:5) = -2
90    r = 5
91    ra(1:2) = 6.5
92    d = -2.5
93    da(2:4) = 8.5
94    c = cmplx (2.5, -3.5)
95    ca(1) = cmplx (4.5, 5)
96  else if (n .eq. 1) then
97    i = 2
98    ia(4:6) = 5
99    r = 1
100    ra(2:4) = -1.5
101    d = 8.5
102    da(1:3) = 2.5
103    c = cmplx (0.5, -3)
104    ca(2:3) = cmplx (-1, 6)
105  else
106    i = 1
107    ia = 1
108    r = -1
109    ra = -1
110    d = 1
111    da = -1
112    c = 1
113    ca = cmplx (-1, 0)
114  end if
115!$omp end parallel
116  if (v) STOP 8
117  if (cnt .eq. 3) then
118    if (i .ne. 8 .or. any (ia .ne. (/3, 3, 1, 6, 6, 8/))) STOP 9
119    if (r .ne. 8 .or. any (ra .ne. (/9.5, 8.0, 1.5, 1.5/))) STOP 10
120    if (d .ne. 12.5 .or. any (da .ne. (/8.0, 16.5, 16.5, 14.0, 5.5/))) STOP 11
121    if (c .ne. cmplx (11.5, -5)) STOP 12
122    if (ca(1) .ne. cmplx (12, 2)) STOP 13
123    if (ca(2) .ne. cmplx (6.5, 3) .or. ca(2) .ne. ca(3)) STOP 14
124  end if
125
126  i = 1
127  ia = 2
128  r = 4
129  ra = 8
130  d = 16
131  da = 32
132  c = 2
133  ca = cmplx (0, 2)
134  v = .false.
135  cnt = -1
136
137!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
138!$omp & reduction (*:i, ia, r, ra, d, da, c, ca)
139!$ if (i .ne. 1 .or. any (ia .ne. 1)) v = .true.
140!$ if (r .ne. 1 .or. any (ra .ne. 1)) v = .true.
141!$ if (d .ne. 1 .or. any (da .ne. 1)) v = .true.
142!$ if (c .ne. cmplx (1) .or. any (ca .ne. cmplx (1))) v = .true.
143  n = omp_get_thread_num ()
144  if (n .eq. 0) then
145    cnt = omp_get_num_threads ()
146    i = 3
147    ia(3:5) = 2
148    r = 0.5
149    ra(1:2) = 2
150    d = -1
151    da(2:4) = -2
152    c = 2.5
153    ca(1) = cmplx (-5, 0)
154  else if (n .eq. 1) then
155    i = 2
156    ia(4:6) = -2
157    r = 8
158    ra(2:4) = -0.5
159    da(1:3) = -1
160    c = -3
161    ca(2:3) = cmplx (0, -1)
162  else
163    ia = 2
164    r = 0.5
165    ra = 0.25
166    d = 2.5
167    da = -1
168    c = cmplx (0, -1)
169    ca = cmplx (-1, 0)
170  end if
171!$omp end parallel
172  if (v) STOP 15
173  if (cnt .eq. 3) then
174    if (i .ne. 6 .or. any (ia .ne. (/4, 4, 8, -16, -16, -8/))) STOP 16
175    if (r .ne. 8 .or. any (ra .ne. (/4., -2., -1., -1./))) STOP 17
176    if (d .ne. -40 .or. any (da .ne. (/32., -64., -64., 64., -32./))) STOP 18
177    if (c .ne. cmplx (0, 15)) STOP 19
178    if (ca(1) .ne. cmplx (0, 10)) STOP 20
179    if (ca(2) .ne. cmplx (-2, 0) .or. ca(2) .ne. ca(3)) STOP 21
180  end if
181end
182