1! RUN: %python %S/../test_errors.py %s %flang -fopenmp
2! OpenMP version 5.0.0
3! 2.13.3 parallel sections Construct
4! The restrictions for the parallel construct and the sections construct apply
5program OmpConstructSections01
6   use omp_lib
7   integer :: section_count = 0
8   integer, parameter :: NT = 4
9   integer :: i, array(10)
10   type my_type
11      integer :: array(10)
12   end type my_type
13   type(my_type) :: my_var
14   print *, 'section_count', section_count
15   do i = 1, 10
16      array(i) = i
17   end do
18!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause
19!$omp parallel sections shared(array(i))
20!$omp end parallel sections
21!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause
22!$omp parallel sections shared(my_var%array)
23!$omp end parallel sections
24
25!ERROR: invalid branch into an OpenMP structured block
26!ERROR: invalid branch into an OpenMP structured block
27!ERROR: invalid branch into an OpenMP structured block
28   if (NT) 20, 30, 40
29!ERROR: invalid branch into an OpenMP structured block
30   goto 20
31!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause
32!$omp parallel sections private(my_var%array)
33   !$omp section
34   print *, "This is a single statement structured block"
35   !$omp section
36   open (10, file="random-file-name.txt", err=30)
37   !ERROR: invalid branch into an OpenMP structured block
38   !ERROR: invalid branch leaving an OpenMP structured block
39   open (10, file="random-file-name.txt", err=40)
40   !$omp section
41   section_count = section_count + 1
4220 print *, 'Entering into section'
43   call calledFromWithinSection()
44   print *, 'section_count', section_count
45   !$omp section
46   section_count = section_count + 1
47   print *, 'section_count', section_count
48   !ERROR: invalid branch leaving an OpenMP structured block
49   goto 10
50   !$omp section
5130 print *, "Error in opening file"
52!$omp end parallel sections
5310 print *, 'Jump from section'
54!ERROR: A variable that is part of another variable (as an array or structure element) cannot appear in a PRIVATE or SHARED clause
55!$omp parallel sections private(array(i))
56   !$omp section
5740 print *, 'Error in opening file'
58!$omp end parallel sections
59end program OmpConstructSections01
60
61function returnFromSections()
62   !$omp parallel sections
63   !$omp section
64   !ERROR: RETURN statement is not allowed in a PARALLEL SECTIONS construct
65   RETURN
66   !$omp end parallel sections
67end function
68
69subroutine calledFromWithinSection()
70   print *, "I am called from within a 'section' structured block"
71   return
72end subroutine calledFromWithinSection
73
74subroutine continueWithinSections()
75   integer i
76   do i = 1, 10
77      print *, "Statement within loop but outside section construct"
78      !$omp parallel sections
79      !$omp section
80      IF (i .EQ. 5) THEN
81         !ERROR: CYCLE to construct outside of PARALLEL SECTIONS construct is not allowed
82         CYCLE
83      END IF
84      !$omp end parallel sections
85      print *, "Statement within loop but outside section contruct"
86   end do
87
88   !$omp parallel sections
89   !$omp section
90   do i = 1, 10
91      CYCLE
92   end do
93   !$omp end parallel sections
94
95   !$omp parallel sections
96   !$omp section
97   loop_1: do i = 1, 10
98      IF (i .EQ. 5) THEN
99         CYCLE loop_1
100      END IF
101   end do loop_1
102   !$omp end parallel sections
103
104   loop_2: do i = 1, 10
105      !$omp parallel sections
106      !$omp section
107      IF (i .EQ. 5) THEN
108         !ERROR: CYCLE to construct 'loop_2' outside of PARALLEL SECTIONS construct is not allowed
109         CYCLE loop_2
110      END IF
111      !$omp end parallel sections
112   end do loop_2
113end subroutine continueWithinSections
114
115subroutine breakWithinSections()
116   loop_3: do i = 1, 10
117      !$omp parallel sections
118      !$omp section
119      IF (i .EQ. 5) THEN
120         !ERROR: EXIT to construct 'loop_3' outside of PARALLEL SECTIONS construct is not allowed
121         EXIT loop_3
122      END IF
123      !$omp end parallel sections
124   end do loop_3
125
126   loop_4: do i = 1, 10
127      !$omp parallel sections
128      !$omp section
129      IF (i .EQ. 5) THEN
130         !ERROR: EXIT to construct outside of PARALLEL SECTIONS construct is not allowed
131         EXIT
132      END IF
133      !$omp end parallel sections
134   end do loop_4
135
136   !$omp parallel sections
137   !$omp section
138   do i = 1, 10
139      IF (i .EQ. 5) THEN
140         EXIT
141      END IF
142   end do
143   !$omp end parallel sections
144
145   !$omp parallel sections
146   !$omp section
147   loop_5: do i = 1, 10
148      IF (i .EQ. 5) THEN
149         EXIT loop_5
150      END IF
151   end do loop_5
152   !$omp end parallel sections
153end subroutine breakWithinSections
154