1! { dg-do compile }
2
3SUBROUTINE foo(n,array)
4    IMPLICIT NONE
5    INTEGER, INTENT (IN) :: n
6    REAL, INTENT(INOUT),OPTIONAL:: array(:)
7    INTEGER:: i
8
9    !$OMP PARALLEL DO DEFAULT(none) SHARED(array,n) PRIVATE(i)
10    DO i = 1,n
11       IF (PRESENT(array)) THEN
12          array(i) = array(i) + i
13       ENDIF
14    ENDDO
15    !$OMP END PARALLEL DO
16END SUBROUTINE foo
17
18subroutine s1 (array)
19  real, optional :: array(:)
20  !$omp parallel default(none) firstprivate (array)
21  if (present (array)) array(:) = 3
22  !$omp end parallel
23end subroutine
24
25subroutine s2 (array)
26  real, optional :: array(:)
27  !$omp parallel default(none) shared (array)
28  !$omp master
29  if (present (array)) array(:) = 3
30  !$omp end master
31  !$omp end parallel
32end subroutine
33
34subroutine s3 (array)
35  real, optional :: array(:)
36  !$omp parallel default(none) private (array)
37  if (present (array)) array(:) = 3
38  !$omp end parallel
39end subroutine
40
41subroutine s4 (arg)
42  real, optional :: arg
43  !$omp parallel default(none) firstprivate (arg)
44  if (present (arg)) arg = 3
45  !$omp end parallel
46end subroutine
47
48subroutine s5 (arg)
49  real, optional :: arg
50  !$omp parallel default(none) shared (arg)
51  !$omp master
52  if (present (arg)) arg = 3
53  !$omp end master
54  !$omp end parallel
55end subroutine
56
57subroutine s6 (arg)
58  real, optional :: arg
59  !$omp parallel default(none) private (arg)
60  if (present (arg)) arg = 3
61  !$omp end parallel
62end subroutine
63
64subroutine s7 (arg)
65  real, value, optional :: arg
66  !$omp parallel default(none) firstprivate (arg)
67  if (present (arg)) arg = 3
68  !$omp end parallel
69end subroutine
70
71subroutine s8 (arg)
72  real, value, optional :: arg
73  !$omp parallel default(none) shared (arg)
74  !$omp master
75  if (present (arg)) arg = 3
76  !$omp end master
77  !$omp end parallel
78end subroutine
79
80subroutine s9 (arg)
81  real, value, optional :: arg
82  !$omp parallel default(none) private (arg)
83  if (present (arg)) arg = 3
84  !$omp end parallel
85end subroutine
86
87subroutine s10 (arg)
88  real, optional :: arg(..)
89  !$omp parallel default(none) private (arg)
90  if (present (arg)) stop 10
91  !$omp end parallel
92end subroutine
93
94subroutine w1 (array)
95  real, optional :: array(:)
96  !$omp parallel default(none)     ! { dg-error "enclosing 'parallel'" }
97  if (.not.present (array)) stop 1 ! { dg-error "'array' not specified in enclosing 'parallel'" }
98  !$omp end parallel
99end subroutine
100
101subroutine w2 (array2)
102  real, optional :: array2(*)
103  !$omp parallel default(none)      ! { dg-error "enclosing 'parallel'" "TODO" { xfail *-*-* } }
104  if (.not.present (array2)) stop 2 ! { dg-error "'array2' not specified in enclosing 'parallel'" "TODO" { xfail *-*-* } }
105  !$omp end parallel
106end subroutine
107
108subroutine w3 (arg)
109  real, optional :: arg
110  !$omp parallel default(none)    ! { dg-error "enclosing 'parallel'" }
111  if (.not.present (arg)) stop 3  ! { dg-error "'arg' not specified in enclosing 'parallel'" }
112  !$omp end parallel
113end subroutine
114
115subroutine w4 (arg2)
116  real, value, optional :: arg2
117  !$omp parallel default(none)     ! { dg-error "enclosing 'parallel" "TODO" { xfail *-*-* } }
118  if (.not.present (arg2)) stop 4  ! { dg-error "'arg2' not specified in enclosing 'parallel'" "TODO" { xfail *-*-*} }
119  !$omp end parallel
120end subroutine
121
122subroutine w5 (array3)
123  real, optional :: array3(..)
124  !$omp parallel default(none)      ! { dg-error "enclosing 'parallel'" }
125  if (.not.present (array3)) stop 5 ! { dg-error "'array3' not specified in enclosing 'parallel'" }
126  !$omp end parallel
127end subroutine
128