1! { dg-do run }
2
3program main
4  integer, parameter :: N = 32
5  integer igot, iexp, itmp
6  integer, dimension (0:N) :: iarr
7  real fgot, fexp, ftmp
8  real, dimension (0:N) :: farr
9  logical lgot, lexp, ltmp
10
11  igot = 0
12  iexp = N * 2
13
14  !$acc parallel copy (igot, itmp)
15    do i = 1, N
16  !$acc atomic capture
17      itmp = igot
18      igot = i + i
19  !$acc end atomic
20    end do
21  !$acc end parallel
22
23  if (igot /= iexp) STOP 1
24  if (itmp /= iexp - 2) STOP 2
25
26  fgot = 1234.0
27  fexp = 1266.0
28
29  !$acc parallel loop copy (fgot, ftmp)
30    do i = 1, N
31  !$acc atomic capture
32      farr(i) = fgot
33      fgot = fgot + 1.0
34  !$acc end atomic
35    end do
36  !$acc end parallel loop
37
38  do i = 1, N
39     if (.not. &
40          (1234.0 <= farr(i) .and. farr(i) < fexp &
41          .and. aint (farr(i)) == farr(i))) STOP 3
42  end do
43  if (fgot /= fexp) STOP 4
44
45  fgot = 1.0
46  fexp = 2.0**32
47
48  !$acc parallel loop copy (fgot, ftmp)
49    do i = 1, N
50  !$acc atomic capture
51      farr(i) = fgot
52      fgot = fgot * 2.0
53  !$acc end atomic
54    end do
55  !$acc end parallel loop
56
57  do i = 1, N
58     if (.not. &
59          (1.0 <= farr(i) .and. farr(i) < fexp &
60          .and. aint (farr(i)) == farr(i))) STOP 5
61  end do
62  if (fgot /= fexp) STOP 6
63
64  fgot = 32.0
65  fexp = fgot - N
66
67  !$acc parallel loop copy (fgot, ftmp)
68    do i = 1, N
69  !$acc atomic capture
70      farr(i) = fgot
71      fgot = fgot - 1.0
72  !$acc end atomic
73    end do
74  !$acc end parallel loop
75
76  do i = 1, N
77     if (.not. &
78          (fexp < farr(i) .and. farr(i) <= 32.0 &
79          .and. aint (farr(i)) == farr(i))) STOP 7
80  end do
81  if (fgot /= fexp) STOP 8
82
83  fgot = 2**32.0
84  fexp = 1.0
85
86  !$acc parallel loop copy (fgot, ftmp)
87    do i = 1, N
88  !$acc atomic capture
89      farr(i) = fgot
90      fgot = fgot / 2.0
91  !$acc end atomic
92    end do
93  !$acc end parallel loop
94
95  do i = 1, N
96     if (.not. &
97          (fexp < farr(i) .and. farr(i) <= 2**32.0 &
98          .and. aint (farr(i)) == farr(i))) STOP 9
99  end do
100  if (fgot /= fexp) STOP 10
101
102  lgot = .TRUE.
103  lexp = .FALSE.
104
105  !$acc parallel copy (lgot, ltmp)
106  !$acc atomic capture
107    ltmp = lgot
108    lgot = lgot .and. .FALSE.
109  !$acc end atomic
110  !$acc end parallel
111
112  if (ltmp .neqv. .not. lexp) STOP 11
113  if (lgot .neqv. lexp) STOP 12
114
115  lgot = .FALSE.
116  lexp = .FALSE.
117
118  !$acc parallel copy (lgot, ltmp)
119  !$acc atomic capture
120    ltmp = lgot
121    lgot = lgot .or. .FALSE.
122  !$acc end atomic
123  !$acc end parallel
124
125  if (ltmp .neqv. lexp) STOP 13
126  if (lgot .neqv. lexp) STOP 14
127
128  lgot = .FALSE.
129  lexp = .FALSE.
130
131  !$acc parallel copy (lgot, ltmp)
132  !$acc atomic capture
133    ltmp = lgot
134    lgot = lgot .eqv. .TRUE.
135  !$acc end atomic
136  !$acc end parallel
137
138  if (ltmp .neqv. lexp) STOP 15
139  if (lgot .neqv. lexp) STOP 16
140
141  lgot = .FALSE.
142  lexp = .TRUE.
143
144  !$acc parallel copy (lgot, ltmp)
145  !$acc atomic capture
146    ltmp = lgot
147    lgot = lgot .neqv. .TRUE.
148  !$acc end atomic
149  !$acc end parallel
150
151  if (ltmp .neqv. .not. lexp) STOP 17
152  if (lgot .neqv. lexp) STOP 18
153
154  fgot = 1234.0
155  fexp = 1266.0
156
157  !$acc parallel loop copy (fgot, ftmp)
158    do i = 1, N
159  !$acc atomic capture
160      farr(i) = fgot
161      fgot = 1.0 + fgot
162  !$acc end atomic
163    end do
164  !$acc end parallel loop
165
166  do i = 1, N
167     if (.not. &
168          (1234.0 <= farr(i) .and. farr(i) < fexp &
169          .and. aint (farr(i)) == farr(i))) STOP 19
170  end do
171  if (fgot /= fexp) STOP 20
172
173  fgot = 1.0
174  fexp = 2.0**32
175
176  !$acc parallel loop copy (fgot, ftmp)
177    do i = 1, N
178  !$acc atomic capture
179      farr(i) = fgot
180      fgot = 2.0 * fgot
181  !$acc end atomic
182    end do
183  !$acc end parallel loop
184
185  do i = 1, N
186     if (.not. &
187          (1.0 <= farr(i) .and. farr(i) < fexp &
188          .and. aint (farr(i)) == farr(i))) STOP 21
189  end do
190  if (fgot /= fexp) STOP 22
191
192  fgot = 32.0
193  fexp = 32.0
194
195  !$acc parallel loop copy (fgot, ftmp)
196    do i = 1, N
197  !$acc atomic capture
198      farr(i) = fgot
199      fgot = 2.0 - fgot
200  !$acc end atomic
201    end do
202  !$acc end parallel loop
203
204  do i = 1, N
205     if (.not. (farr(i) == fexp .or. farr(i) == -30.0)) STOP 23
206  end do
207  if (fgot /= fexp) STOP 24
208
209  fgot = 2.0**16
210  fexp = 2.0**16
211
212  !$acc parallel loop copy (fgot, ftmp)
213    do i = 1, N
214  !$acc atomic capture
215      farr(i) = fgot
216      fgot = 2.0 / fgot
217  !$acc end atomic
218    end do
219  !$acc end parallel loop
220
221  do i = 1, N
222     if (.not. (farr(i) == fexp .or. farr(i) == 1.0 / 2.0**15)) STOP 25
223  end do
224  if (fgot /= fexp) STOP 26
225
226  lgot = .TRUE.
227  lexp = .FALSE.
228
229  !$acc parallel copy (lgot, ltmp)
230  !$acc atomic capture
231    ltmp = lgot
232    lgot = .FALSE. .and. lgot
233  !$acc end atomic
234  !$acc end parallel
235
236  if (ltmp .neqv. .not. lexp) STOP 27
237  if (lgot .neqv. lexp) STOP 28
238
239  lgot = .FALSE.
240  lexp = .FALSE.
241
242  !$acc parallel copy (lgot, ltmp)
243  !$acc atomic capture
244    ltmp = lgot
245    lgot = .FALSE. .or. lgot
246  !$acc end atomic
247  !$acc end parallel
248
249  if (ltmp .neqv. lexp) STOP 29
250  if (lgot .neqv. lexp) STOP 30
251
252  lgot = .FALSE.
253  lexp = .FALSE.
254
255  !$acc parallel copy (lgot, ltmp)
256  !$acc atomic capture
257    ltmp = lgot
258    lgot = .TRUE. .eqv. lgot
259  !$acc end atomic
260  !$acc end parallel
261
262  if (ltmp .neqv. lexp) STOP 31
263  if (lgot .neqv. lexp) STOP 32
264
265  lgot = .FALSE.
266  lexp = .TRUE.
267
268  !$acc parallel copy (lgot, ltmp)
269  !$acc atomic capture
270    ltmp = lgot
271    lgot = .TRUE. .neqv. lgot
272  !$acc end atomic
273  !$acc end parallel
274
275  if (ltmp .neqv. .not. lexp) STOP 33
276  if (lgot .neqv. lexp) STOP 34
277
278  igot = 0
279  iexp = N
280  iarr = -42
281
282  !$acc parallel loop copy (igot, itmp)
283    do i = 1, N
284  !$acc atomic capture
285      iarr(i) = igot
286      igot = max (igot, i)
287  !$acc end atomic
288    end do
289  !$acc end parallel loop
290
291  if (igot /= N) stop 107
292  itmp = 0
293  do i = 1, N
294     if (iarr(i) == 0) then
295       itmp = i
296       exit
297     end if
298  end do
299  ! At most one iarr element can be 0.
300  do i = 1, N
301     if ((iarr(i) == 0 .and. i /= itmp) &
302         .or. iarr(i) < 0 .or. iarr(i) > N) STOP 35
303  end do
304  if (igot /= iexp) STOP 36
305
306  igot = N + 1
307  iexp = 1
308  iarr = -42
309
310  !$acc parallel loop copy (igot, itmp)
311    do i = 1, N
312  !$acc atomic capture
313      iarr(i) = igot
314      igot = min (igot, i)
315  !$acc end atomic
316    end do
317  !$acc end parallel loop
318
319  if (igot /= 1) stop 108
320  itmp = N + 1
321  ! At most one iarr element can be N+1.
322  do i = 1, N
323     if (iarr(i) == N + 1) then
324       itmp = i
325       exit
326     end if
327  end do
328  do i = 1, N
329     if ((iarr(i) == N + 1 .and. i /= itmp) &
330         .or. iarr(i) <= 0 .or. iarr(i) > N + 1) STOP 37
331  end do
332  if (igot /= iexp) STOP 38
333
334  igot = -1
335  iexp = 0
336
337  !$acc parallel loop copy (igot, itmp)
338    do i = 0, N - 1
339      iexpr = ibclr (-1, i)
340  !$acc atomic capture
341      iarr(i) = igot
342      igot = iand (igot, iexpr)
343  !$acc end atomic
344    end do
345  !$acc end parallel loop
346
347  do i = 1, N
348     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 39
349  end do
350  if (igot /= iexp) STOP 40
351
352  igot = 0
353  iexp = -1
354
355  !$acc parallel loop copy (igot, itmp)
356    do i = 0, N - 1
357      iexpr = lshift (1, i)
358  !$acc atomic capture
359      iarr(i) = igot
360      igot = ior (igot, iexpr)
361  !$acc end atomic
362    end do
363  !$acc end parallel loop
364
365  do i = 1, N
366     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 41
367  end do
368  if (igot /= iexp) STOP 42
369
370  igot = -1
371  iexp = 0
372
373  !$acc parallel loop copy (igot, itmp)
374    do i = 0, N - 1
375      iexpr = lshift (1, i)
376  !$acc atomic capture
377      iarr(i) = igot
378      igot = ieor (igot, iexpr)
379  !$acc end atomic
380    end do
381  !$acc end parallel loop
382
383  do i = 1, N
384     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 43
385  end do
386  if (igot /= iexp) STOP 44
387
388  igot = 1
389  iexp = N
390
391  !$acc parallel loop copy (igot, itmp)
392    do i = 1, N
393  !$acc atomic capture
394      iarr(i) = igot
395      igot = max (i, igot)
396  !$acc end atomic
397    end do
398  !$acc end parallel loop
399
400  do i = 1, N
401     if (.not. (1 <= iarr(i) .and. iarr(i) <= iexp)) STOP 45
402  end do
403  if (igot /= iexp) STOP 46
404
405  igot = N
406  iexp = 1
407
408  !$acc parallel loop copy (igot, itmp)
409    do i = 1, N
410  !$acc atomic capture
411      iarr(i) = igot
412      igot = min (i, igot)
413  !$acc end atomic
414    end do
415  !$acc end parallel loop
416
417  do i = 1, N
418     if (.not. (iarr(i) >= 1 .or. iarr(i) <= N)) STOP 47
419  end do
420  if (igot /= iexp) STOP 48
421
422  igot = -1
423  iexp = 0
424
425  !$acc parallel loop copy (igot, itmp)
426    do i = 0, N - 1
427      iexpr = ibclr (-1, i)
428  !$acc atomic capture
429      iarr(i) = igot
430      igot = iand (iexpr, igot)
431  !$acc end atomic
432    end do
433  !$acc end parallel loop
434
435  do i = 1, N
436     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 49
437  end do
438  if (igot /= iexp) STOP 50
439
440  igot = 0
441  iexp = -1
442	!!
443  !$acc parallel loop copy (igot, itmp)
444    do i = 0, N - 1
445      iexpr = lshift (1, i)
446  !$acc atomic capture
447      iarr(i) = igot
448      igot = ior (iexpr, igot)
449  !$acc end atomic
450    end do
451  !$acc end parallel loop
452
453  do i = 1, N
454     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 51
455  end do
456  if (igot /= iexp) STOP 52
457
458  igot = -1
459  iexp = 0
460
461  !$acc parallel loop copy (igot, itmp)
462    do i = 0, N - 1
463      iexpr = lshift (1, i)
464  !$acc atomic capture
465      iarr(i) = igot
466      igot = ieor (iexpr, igot)
467  !$acc end atomic
468    end do
469  !$acc end parallel loop
470
471  do i = 1, N
472     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 53
473  end do
474  if (igot /= iexp) STOP 54
475
476  fgot = 1234.0
477  fexp = 1266.0
478
479  !$acc parallel loop copy (fgot, ftmp)
480    do i = 1, N
481  !$acc atomic capture
482      fgot = fgot + 1.0
483      farr(i) = fgot
484  !$acc end atomic
485    end do
486  !$acc end parallel loop
487
488  do i = 1, N
489     if (.not. &
490          (1234.0 < farr(i) .and. farr(i) <= fexp &
491          .and. aint (farr(i)) == farr(i))) STOP 55
492  end do
493  if (fgot /= fexp) STOP 56
494
495  fgot = 1.0
496  fexp = 2.0**32
497
498  !$acc parallel loop copy (fgot, ftmp)
499    do i = 1, N
500  !$acc atomic capture
501      fgot = fgot * 2.0
502      farr(i) = fgot
503  !$acc end atomic
504    end do
505  !$acc end parallel loop
506
507  do i = 1, N
508     if (.not. &
509          (1.0 < farr(i) .and. farr(i) <= fexp &
510          .and. aint (farr(i)) == farr(i))) STOP 57
511  end do
512  if (fgot /= fexp) STOP 58
513
514  fgot = 32.0
515  fexp = fgot - N
516
517  !$acc parallel loop copy (fgot, ftmp)
518    do i = 1, N
519  !$acc atomic capture
520      fgot = fgot - 1.0
521      farr(i) = fgot
522  !$acc end atomic
523    end do
524  !$acc end parallel loop
525
526  do i = 1, N
527     if (.not. &
528          (fexp <= farr(i) .and. farr(i) < 32.0 &
529          .and. aint (farr(i)) == farr(i))) STOP 59
530  end do
531  if (fgot /= fexp) STOP 60
532
533  fgot = 2**32.0
534  fexp = 1.0
535
536  !$acc parallel loop copy (fgot, ftmp)
537    do i = 1, N
538  !$acc atomic capture
539      fgot = fgot / 2.0
540      farr(i) = fgot
541  !$acc end atomic
542    end do
543  !$acc end parallel loop
544
545  do i = 1, N
546     if (.not. &
547          (fexp <= farr(i) .and. farr(i) < 2**32.0 &
548          .and. aint (farr(i)) == farr(i))) STOP 61
549  end do
550  if (fgot /= fexp) STOP 62
551
552  lgot = .TRUE.
553  lexp = .FALSE.
554
555  !$acc parallel copy (lgot, ltmp)
556  !$acc atomic capture
557    lgot = lgot .and. .FALSE.
558    ltmp = lgot
559  !$acc end atomic
560  !$acc end parallel
561
562  if (ltmp .neqv. lexp) STOP 63
563  if (lgot .neqv. lexp) STOP 64
564
565  lgot = .FALSE.
566  lexp = .FALSE.
567
568  !$acc parallel copy (lgot, ltmp)
569  !$acc atomic capture
570    lgot = lgot .or. .FALSE.
571    ltmp = lgot
572  !$acc end atomic
573  !$acc end parallel
574
575  if (ltmp .neqv. lexp) STOP 65
576  if (lgot .neqv. lexp) STOP 66
577
578  lgot = .FALSE.
579  lexp = .FALSE.
580
581  !$acc parallel copy (lgot, ltmp)
582  !$acc atomic capture
583    lgot = lgot .eqv. .TRUE.
584    ltmp = lgot
585  !$acc end atomic
586  !$acc end parallel
587
588  if (ltmp .neqv. lexp) STOP 67
589  if (lgot .neqv. lexp) STOP 68
590
591  lgot = .FALSE.
592  lexp = .TRUE.
593
594  !$acc parallel copy (lgot, ltmp)
595  !$acc atomic capture
596    lgot = lgot .neqv. .TRUE.
597    ltmp = lgot
598  !$acc end atomic
599  !$acc end parallel
600
601  if (ltmp .neqv. lexp) STOP 69
602  if (lgot .neqv. lexp) STOP 70
603
604  fgot = 1234.0
605  fexp = 1266.0
606
607  !$acc parallel loop copy (fgot, ftmp)
608    do i = 1, N
609  !$acc atomic capture
610      fgot = 1.0 + fgot
611      farr(i) = fgot
612  !$acc end atomic
613    end do
614  !$acc end parallel loop
615
616  do i = 1, N
617     if (.not. &
618          (1234.0 < farr(i) .and. farr(i) <= fexp &
619          .and. aint (farr(i)) == farr(i))) STOP 71
620  end do
621  if (fgot /= fexp) STOP 72
622
623  fgot = 1.0
624  fexp = 2.0**32
625
626  !$acc parallel loop copy (fgot, ftmp)
627    do i = 1, N
628  !$acc atomic capture
629      fgot = 2.0 * fgot
630      farr(i) = fgot
631  !$acc end atomic
632    end do
633  !$acc end parallel loop
634
635  do i = 1, N
636     if (.not. &
637          (1.0 < farr(i) .and. farr(i) <= 2**32.0 &
638          .and. aint (farr(i)) == farr(i))) STOP 73
639  end do
640  if (fgot /= fexp) STOP 74
641
642  fgot = 32.0
643  fexp = 32.0
644
645  !$acc parallel loop copy (fgot, ftmp)
646    do i = 1, N
647  !$acc atomic capture
648      fgot = 2.0 - fgot
649      farr(i) = fgot
650  !$acc end atomic
651    end do
652  !$acc end parallel loop
653
654  do i = 1, N
655     if (.not. (farr(i) == fexp .or. farr(i) == 2.0 - fexp)) STOP 75
656  end do
657  if (fgot /= fexp) STOP 76
658
659  fgot = 2.0**16
660  fexp = 2.0**16
661
662  !$acc parallel loop copy (fgot, ftmp)
663    do i = 1, N
664  !$acc atomic capture
665      fgot = 2.0 / fgot
666      farr(i) = fgot
667  !$acc end atomic
668    end do
669  !$acc end parallel loop
670
671  do i = 1, N
672     if (.not. (farr(i) == fexp .or. farr(i) == 2.0 / fexp)) STOP 77
673  end do
674  if (fgot /= fexp) STOP 78
675
676  lgot = .TRUE.
677  lexp = .FALSE.
678
679  !$acc parallel copy (lgot, ltmp)
680  !$acc atomic capture
681    lgot = .FALSE. .and. lgot
682    ltmp = lgot
683  !$acc end atomic
684  !$acc end parallel
685
686  if (ltmp .neqv. lexp) STOP 79
687  if (lgot .neqv. lexp) STOP 80
688
689  lgot = .FALSE.
690  lexp = .FALSE.
691
692  !$acc parallel copy (lgot, ltmp)
693  !$acc atomic capture
694    lgot = .FALSE. .or. lgot
695    ltmp = lgot
696  !$acc end atomic
697  !$acc end parallel
698
699  if (ltmp .neqv. lexp) STOP 81
700  if (lgot .neqv. lexp) STOP 82
701
702  lgot = .FALSE.
703  lexp = .FALSE.
704
705  !$acc parallel copy (lgot, ltmp)
706  !$acc atomic capture
707    lgot = .TRUE. .eqv. lgot
708    ltmp = lgot
709  !$acc end atomic
710  !$acc end parallel
711
712  if (ltmp .neqv. lexp) STOP 83
713  if (lgot .neqv. lexp) STOP 84
714
715  lgot = .FALSE.
716  lexp = .TRUE.
717
718  !$acc parallel copy (lgot, ltmp)
719  !$acc atomic capture
720    lgot = .TRUE. .neqv. lgot
721    ltmp = lgot
722  !$acc end atomic
723  !$acc end parallel
724
725  if (ltmp .neqv. lexp) STOP 85
726  if (lgot .neqv. lexp) STOP 86
727
728  igot = 1
729  iexp = N
730
731  !$acc parallel loop copy (igot, itmp)
732    do i = 1, N
733  !$acc atomic capture
734      igot = max (igot, i)
735      iarr(i) = igot
736  !$acc end atomic
737    end do
738  !$acc end parallel loop
739
740  do i = 1, N
741     if (.not. (1 <= iarr(i) .and. iarr(i) <= N)) STOP 87
742  end do
743  if (igot /= iexp) STOP 88
744
745  igot = N
746  iexp = 1
747
748  !$acc parallel loop copy (igot, itmp)
749    do i = 1, N
750  !$acc atomic capture
751      igot = min (igot, i)
752      iarr(i) = igot
753  !$acc end atomic
754    end do
755  !$acc end parallel loop
756
757  do i = 1, N
758     if (.not. (iarr(i) <= i)) STOP 89
759  end do
760  if (igot /= iexp) STOP 90
761
762  igot = -1
763  iexp = 0
764
765  !$acc parallel loop copy (igot, itmp)
766    do i = 0, N - 1
767      iexpr = ibclr (-2, i)
768  !$acc atomic capture
769      igot = iand (igot, iexpr)
770      iarr(i) = igot
771  !$acc end atomic
772    end do
773  !$acc end parallel loop
774
775  do i = 1, N
776     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 91
777  end do
778  if (igot /= iexp) STOP 92
779
780  igot = 0
781  iexp = -1
782
783  !$acc parallel loop copy (igot, itmp)
784    do i = 0, N - 1
785      iexpr = lshift (1, i)
786  !$acc atomic capture
787      igot = ior (igot, iexpr)
788      iarr(i) = igot
789  !$acc end atomic
790    end do
791  !$acc end parallel loop
792
793  do i = 1, N
794     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 93
795  end do
796  if (igot /= iexp) STOP 94
797
798  igot = -1
799  iexp = 0
800
801  !$acc parallel loop copy (igot, itmp)
802    do i = 0, N - 1
803      iexpr = lshift (1, i)
804  !$acc atomic capture
805      igot = ieor (igot, iexpr)
806      iarr(i) = igot
807  !$acc end atomic
808    end do
809  !$acc end parallel loop
810
811  do i = 1, N
812     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 95
813  end do
814  if (igot /= iexp) STOP 96
815
816  igot = 1
817  iexp = N
818
819  !$acc parallel loop copy (igot, itmp)
820    do i = 1, N
821  !$acc atomic capture
822      igot = max (i, igot)
823      iarr(i) = igot
824  !$acc end atomic
825    end do
826  !$acc end parallel loop
827
828  do i = 1, N
829     if (.not. (1 <= iarr(i) .and. iarr(i) <= iexp)) STOP 97
830  end do
831  if (igot /= iexp) STOP 98
832
833  igot = N
834  iexp = 1
835
836  !$acc parallel loop copy (igot, itmp)
837    do i = 1, N
838  !$acc atomic capture
839      igot = min (i, igot)
840      iarr(i) = igot
841  !$acc end atomic
842    end do
843  !$acc end parallel loop
844
845  do i = 1, N
846     if (.not. (iarr(i) <= i)) STOP 99
847  end do
848  if (igot /= iexp) STOP 100
849
850  igot = -1
851  iexp = 0
852
853  !$acc parallel loop copy (igot, itmp)
854    do i = 0, N - 1
855      iexpr = ibclr (-2, i)
856  !$acc atomic capture
857      igot = iand (iexpr, igot)
858      iarr(i) = igot
859  !$acc end atomic
860    end do
861  !$acc end parallel loop
862
863  do i = 1, N
864     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 101
865  end do
866  if (igot /= iexp) STOP 102
867
868  igot = 0
869  iexp = -1
870
871  !$acc parallel loop copy (igot, itmp)
872    do i = 0, N - 1
873      iexpr = lshift (1, i)
874  !$acc atomic capture
875      igot = ior (iexpr, igot)
876      iarr(i) = igot
877  !$acc end atomic
878    end do
879  !$acc end parallel loop
880
881  do i = 1, N
882     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 103
883  end do
884  if (igot /= iexp) STOP 104
885
886  igot = -1
887  iexp = 0
888
889  !$acc parallel loop copy (igot, itmp)
890    do i = 0, N - 1
891      iexpr = lshift (1, i)
892  !$acc atomic capture
893      igot = ieor (iexpr, igot)
894      iarr(i) = igot
895  !$acc end atomic
896    end do
897  !$acc end parallel loop
898
899  do i = 1, N
900     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 105
901  end do
902  if (igot /= iexp) STOP 106
903
904end program
905