xref: /llvm-project/flang/test/Semantics/OpenACC/acc-serial-loop.f90 (revision a87ca1bbd9a4f36b1edd3d3d3c4a662e05388f4e)
1! RUN: %python %S/../test_errors.py %s %flang -fopenacc
2
3! Check OpenACC clause validity for the following construct and directive:
4!   2.11 Serial Loop
5
6program openacc_serial_loop_validity
7
8  implicit none
9
10  integer :: i, b
11  integer, parameter :: N = 256
12  integer, dimension(N) :: c
13  logical, dimension(N) :: d, e
14  integer :: async1
15  integer :: wait1, wait2
16  real :: reduction_r
17  logical :: reduction_l
18  logical :: ifCondition = .TRUE.
19  real(8), dimension(N) :: a
20
21
22  !$acc serial loop reduction(+: reduction_r)
23  do i = 1, N
24    reduction_r = a(i) + i
25  end do
26
27  !$acc serial loop reduction(*: reduction_r)
28  do i = 1, N
29    reduction_r = reduction_r * (a(i) + i)
30  end do
31
32  !$acc serial loop reduction(min: reduction_r)
33  do i = 1, N
34    reduction_r = min(reduction_r, a(i) * i)
35  end do
36
37  !$acc serial loop reduction(max: reduction_r)
38  do i = 1, N
39    reduction_r = max(reduction_r, a(i) * i)
40  end do
41
42  !$acc serial loop reduction(iand: b)
43  do i = 1, N
44    b = iand(b, c(i))
45  end do
46
47  !$acc serial loop reduction(ior: b)
48  do i = 1, N
49    b = ior(b, c(i))
50  end do
51
52  !$acc serial loop reduction(ieor: b)
53  do i = 1, N
54    b = ieor(b, c(i))
55  end do
56
57  !$acc serial loop reduction(.and.: reduction_l)
58  do i = 1, N
59    reduction_l = d(i) .and. e(i)
60  end do
61
62  !$acc serial loop reduction(.or.: reduction_l)
63  do i = 1, N
64    reduction_l = d(i) .or. e(i)
65  end do
66
67  !$acc serial loop reduction(.eqv.: reduction_l)
68  do i = 1, N
69    reduction_l = d(i) .eqv. e(i)
70  end do
71
72  !$acc serial loop reduction(.neqv.: reduction_l)
73  do i = 1, N
74    reduction_l = d(i) .neqv. e(i)
75  end do
76
77  !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the SERIAL LOOP directive
78  !$acc serial loop device_type(*) if(.TRUE.)
79  do i = 1, N
80    a(i) = 3.14
81  end do
82  !$acc end serial loop
83
84  !$acc serial loop if(ifCondition)
85  do i = 1, N
86    a(i) = 3.14
87  end do
88  !$acc end serial loop
89
90  !$acc serial loop
91  do i = 1, N
92    a(i) = 3.14
93  end do
94  !ERROR: Unmatched END PARALLEL LOOP directive
95  !$acc end parallel loop
96
97  !$acc serial loop
98  do i = 1, N
99    a(i) = 3.14
100  end do
101  !$acc end serial loop
102
103  !$acc serial loop
104  do i = 1, N
105    a(i) = 3.14
106  end do
107  !$acc end serial
108
109  !$acc serial loop
110  do i = 1, n
111    if(i == 10) cycle
112  end do
113
114end program openacc_serial_loop_validity
115