xref: /llvm-project/flang/test/Semantics/OpenACC/acc-branch.f90 (revision f4c5c470cdd6962550cfbdd41318b3a63a9d3747)
11c91d9bdSPeter Klausler! RUN: %python %S/../test_errors.py %s %flang -fopenacc -pedantic
2d2abd62bSValentin Clement
3d2abd62bSValentin Clement! Check OpenACC restruction in branch in and out of some construct
4d2abd62bSValentin Clement!
51c91d9bdSPeter Klauslersubroutine openacc_clause_validity
6d2abd62bSValentin Clement
7d2abd62bSValentin Clement  implicit none
8d2abd62bSValentin Clement
9d2abd62bSValentin Clement  integer :: i, j, k
10d2abd62bSValentin Clement  integer :: N = 256
11d2abd62bSValentin Clement  real(8) :: a(256)
12d2abd62bSValentin Clement
13d2abd62bSValentin Clement  !$acc parallel
14d2abd62bSValentin Clement  !$acc loop
15d2abd62bSValentin Clement  do i = 1, N
16d2abd62bSValentin Clement    a(i) = 3.14
17d2abd62bSValentin Clement    !ERROR: RETURN statement is not allowed in a PARALLEL construct
18d2abd62bSValentin Clement    return
19d2abd62bSValentin Clement  end do
20d2abd62bSValentin Clement  !$acc end parallel
21d2abd62bSValentin Clement
22*f4c5c470SValentin Clement (バレンタイン クレメン)  !$acc parallel loop
23*f4c5c470SValentin Clement (バレンタイン クレメン)  do i = 1, N
24*f4c5c470SValentin Clement (バレンタイン クレメン)    a(i) = 3.14
25*f4c5c470SValentin Clement (バレンタイン クレメン)    !ERROR: RETURN statement is not allowed in a PARALLEL LOOP construct
26*f4c5c470SValentin Clement (バレンタイン クレメン)    return
27*f4c5c470SValentin Clement (バレンタイン クレメン)  end do
28*f4c5c470SValentin Clement (バレンタイン クレメン)
29*f4c5c470SValentin Clement (バレンタイン クレメン)  !$acc serial loop
30*f4c5c470SValentin Clement (バレンタイン クレメン)  do i = 1, N
31*f4c5c470SValentin Clement (バレンタイン クレメン)    a(i) = 3.14
32*f4c5c470SValentin Clement (バレンタイン クレメン)    !ERROR: RETURN statement is not allowed in a SERIAL LOOP construct
33*f4c5c470SValentin Clement (バレンタイン クレメン)    return
34*f4c5c470SValentin Clement (バレンタイン クレメン)  end do
35*f4c5c470SValentin Clement (バレンタイン クレメン)
36*f4c5c470SValentin Clement (バレンタイン クレメン)  !$acc kernels loop
37*f4c5c470SValentin Clement (バレンタイン クレメン)  do i = 1, N
38*f4c5c470SValentin Clement (バレンタイン クレメン)    a(i) = 3.14
39*f4c5c470SValentin Clement (バレンタイン クレメン)    !ERROR: RETURN statement is not allowed in a KERNELS LOOP construct
40*f4c5c470SValentin Clement (バレンタイン クレメン)    return
41*f4c5c470SValentin Clement (バレンタイン クレメン)  end do
42*f4c5c470SValentin Clement (バレンタイン クレメン)
43d2abd62bSValentin Clement  !$acc parallel
44d2abd62bSValentin Clement  !$acc loop
45d2abd62bSValentin Clement  do i = 1, N
46d2abd62bSValentin Clement    a(i) = 3.14
47d2abd62bSValentin Clement    if(i == N-1) THEN
48d2abd62bSValentin Clement      exit
49d2abd62bSValentin Clement    end if
50d2abd62bSValentin Clement  end do
51d2abd62bSValentin Clement  !$acc end parallel
52d2abd62bSValentin Clement
53d2abd62bSValentin Clement  ! Exit branches out of parallel construct, not attached to an OpenACC parallel construct.
54d2abd62bSValentin Clement  name1: do k=1, N
55d2abd62bSValentin Clement  !$acc parallel
56d2abd62bSValentin Clement  !$acc loop
57d2abd62bSValentin Clement  outer: do i=1, N
58d2abd62bSValentin Clement    inner: do j=1, N
59d2abd62bSValentin Clement      ifname: if (j == 2) then
60d2abd62bSValentin Clement        ! These are allowed.
61d2abd62bSValentin Clement        exit
62d2abd62bSValentin Clement        exit inner
63d2abd62bSValentin Clement        exit outer
64d2abd62bSValentin Clement        !ERROR: EXIT to construct 'name1' outside of PARALLEL construct is not allowed
65d2abd62bSValentin Clement        exit name1
66d2abd62bSValentin Clement        ! Exit to construct other than loops.
67d2abd62bSValentin Clement        exit ifname
68d2abd62bSValentin Clement      end if ifname
69d2abd62bSValentin Clement    end do inner
70d2abd62bSValentin Clement  end do outer
71d2abd62bSValentin Clement  !$acc end parallel
72d2abd62bSValentin Clement  end do name1
73d2abd62bSValentin Clement
74d2abd62bSValentin Clement  ! Exit branches out of parallel construct, attached to an OpenACC parallel construct.
75d2abd62bSValentin Clement  thisblk: BLOCK
76d2abd62bSValentin Clement    fortname: if (.true.) then
77594700c1SPeter Klausler      !PORTABILITY: The construct name 'name1' should be distinct at the subprogram level
78d2abd62bSValentin Clement      name1: do k = 1, N
79d2abd62bSValentin Clement        !$acc parallel
80d2abd62bSValentin Clement        !ERROR: EXIT to construct 'fortname' outside of PARALLEL construct is not allowed
81d2abd62bSValentin Clement        exit fortname
82d2abd62bSValentin Clement        !$acc loop
83d2abd62bSValentin Clement          do i = 1, N
84d2abd62bSValentin Clement            a(i) = 3.14
85d2abd62bSValentin Clement            if(i == N-1) THEN
86d2abd62bSValentin Clement              !ERROR: EXIT to construct 'name1' outside of PARALLEL construct is not allowed
87d2abd62bSValentin Clement              exit name1
88d2abd62bSValentin Clement            end if
89d2abd62bSValentin Clement          end do
90d2abd62bSValentin Clement
91d2abd62bSValentin Clement          loop2: do i = 1, N
92d2abd62bSValentin Clement            a(i) = 3.33
93d2abd62bSValentin Clement            !ERROR: EXIT to construct 'thisblk' outside of PARALLEL construct is not allowed
94d2abd62bSValentin Clement            exit thisblk
95d2abd62bSValentin Clement          end do loop2
96d2abd62bSValentin Clement        !$acc end parallel
97d2abd62bSValentin Clement      end do name1
98d2abd62bSValentin Clement    end if fortname
99d2abd62bSValentin Clement  end BLOCK thisblk
100d2abd62bSValentin Clement
101d2abd62bSValentin Clement  !Exit branches inside OpenACC construct.
102d2abd62bSValentin Clement  !$acc parallel
103d2abd62bSValentin Clement  !$acc loop
104d2abd62bSValentin Clement  do i = 1, N
105d2abd62bSValentin Clement    a(i) = 3.14
106d2abd62bSValentin Clement    ifname: if (i == 2) then
107d2abd62bSValentin Clement      ! This is allowed.
108d2abd62bSValentin Clement      exit ifname
109d2abd62bSValentin Clement    end if ifname
110d2abd62bSValentin Clement  end do
111d2abd62bSValentin Clement  !$acc end parallel
112d2abd62bSValentin Clement
113d2abd62bSValentin Clement  !$acc parallel
114d2abd62bSValentin Clement  !$acc loop
115d2abd62bSValentin Clement  do i = 1, N
116d2abd62bSValentin Clement    a(i) = 3.14
117d2abd62bSValentin Clement    if(i == N-1) THEN
11865af17c7SPeixin-Qiao      stop 999 ! no error
119d2abd62bSValentin Clement    end if
120d2abd62bSValentin Clement  end do
121d2abd62bSValentin Clement  !$acc end parallel
122d2abd62bSValentin Clement
123d2abd62bSValentin Clement  !$acc kernels
124d2abd62bSValentin Clement  do i = 1, N
125d2abd62bSValentin Clement    a(i) = 3.14
126d2abd62bSValentin Clement    !ERROR: RETURN statement is not allowed in a KERNELS construct
127d2abd62bSValentin Clement    return
128d2abd62bSValentin Clement  end do
129d2abd62bSValentin Clement  !$acc end kernels
130d2abd62bSValentin Clement
131d2abd62bSValentin Clement  !$acc kernels
132d2abd62bSValentin Clement  do i = 1, N
133d2abd62bSValentin Clement    a(i) = 3.14
134d2abd62bSValentin Clement    if(i == N-1) THEN
135d2abd62bSValentin Clement      exit
136d2abd62bSValentin Clement    end if
137d2abd62bSValentin Clement  end do
138d2abd62bSValentin Clement  !$acc end kernels
139d2abd62bSValentin Clement
140d2abd62bSValentin Clement  !$acc kernels
141d2abd62bSValentin Clement  do i = 1, N
142d2abd62bSValentin Clement    a(i) = 3.14
143d2abd62bSValentin Clement    if(i == N-1) THEN
14465af17c7SPeixin-Qiao      stop 999 ! no error
145d2abd62bSValentin Clement    end if
146d2abd62bSValentin Clement  end do
147d2abd62bSValentin Clement  !$acc end kernels
148d2abd62bSValentin Clement
149d2abd62bSValentin Clement  !$acc serial
150d2abd62bSValentin Clement  do i = 1, N
151d2abd62bSValentin Clement    a(i) = 3.14
152d2abd62bSValentin Clement    !ERROR: RETURN statement is not allowed in a SERIAL construct
153d2abd62bSValentin Clement    return
154d2abd62bSValentin Clement  end do
155d2abd62bSValentin Clement  !$acc end serial
156d2abd62bSValentin Clement
157d2abd62bSValentin Clement  !$acc serial
158d2abd62bSValentin Clement  do i = 1, N
159d2abd62bSValentin Clement    a(i) = 3.14
160d2abd62bSValentin Clement    if(i == N-1) THEN
161d2abd62bSValentin Clement      exit
162d2abd62bSValentin Clement    end if
163d2abd62bSValentin Clement  end do
164d2abd62bSValentin Clement  !$acc end serial
165d2abd62bSValentin Clement
166d2abd62bSValentin Clement  name2: do k=1, N
167d2abd62bSValentin Clement  !$acc serial
168d2abd62bSValentin Clement  do i = 1, N
169d2abd62bSValentin Clement    ifname: if (.true.) then
170d2abd62bSValentin Clement      print *, "LGTM"
171d2abd62bSValentin Clement    a(i) = 3.14
172d2abd62bSValentin Clement    if(i == N-1) THEN
173d2abd62bSValentin Clement        !ERROR: EXIT to construct 'name2' outside of SERIAL construct is not allowed
174d2abd62bSValentin Clement        exit name2
175d2abd62bSValentin Clement        exit ifname
176d2abd62bSValentin Clement      end if
177d2abd62bSValentin Clement    end if ifname
178d2abd62bSValentin Clement    end do
179d2abd62bSValentin Clement  !$acc end serial
180d2abd62bSValentin Clement  end do name2
181d2abd62bSValentin Clement
182d2abd62bSValentin Clement  !$acc serial
183d2abd62bSValentin Clement  do i = 1, N
184d2abd62bSValentin Clement    a(i) = 3.14
185d2abd62bSValentin Clement    if(i == N-1) THEN
18665af17c7SPeixin-Qiao      stop 999 ! no error
187d2abd62bSValentin Clement    end if
188d2abd62bSValentin Clement  end do
189d2abd62bSValentin Clement  !$acc end serial
190d2abd62bSValentin Clement
191d94c042bSValentin Clement
192d94c042bSValentin Clement  !$acc data create(a)
193d94c042bSValentin Clement
194d94c042bSValentin Clement  !ERROR: RETURN statement is not allowed in a DATA construct
195d94c042bSValentin Clement  if (size(a) == 10) return
196d94c042bSValentin Clement
197d94c042bSValentin Clement  !$acc end data
198d94c042bSValentin Clement
1991c91d9bdSPeter Klauslerend subroutine openacc_clause_validity
200