summaryrefslogtreecommitdiff
path: root/flang/test/Semantics/OpenMP/loop-association.f90
blob: b2898d3967a2542aed7deba47c0bb78919074584 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
! RUN: %python %S/../test_errors.py %s %flang -fopenmp

! Check the association between OpenMPLoopConstruct and DoConstruct

  integer :: b = 128
  integer :: c = 32
  integer, parameter :: num = 16
  N = 1024

! Different DO loops

  !$omp parallel
  !$omp do
  do 10 i=1, N
     a = 3.14
10   print *, a
  !$omp end parallel

  !$omp parallel do
  !ERROR: DO CONCURRENT loops cannot form part of a loop nest.
  DO CONCURRENT (i = 1:N)
     a = 3.14
  END DO

  !$omp parallel do simd
  !ERROR: The associated loop of a loop-associated directive cannot be a DO WHILE.
  outer: DO WHILE (c > 1)
     inner: do while (b > 100)
        a = 3.14
        b = b - 1
     enddo inner
     c = c - 1
  END DO outer

  ! Accept directives between parallel do and actual loop.
  !ERROR: A DO loop must follow the PARALLEL DO directive
  !$OMP PARALLEL DO
  !WARNING: Unrecognized compiler directive was ignored [-Wignored-directive]
  !ERROR: Compiler directives are not allowed inside OpenMP loop constructs
  !DIR$ VECTOR ALIGNED
  DO 20 i=1,N
     a = a + 0.5
20   CONTINUE
  !$OMP END PARALLEL DO

  c = 16
  !$omp parallel do
  !ERROR: Loop control is not present in the DO LOOP
  !ERROR: The associated loop of a loop-associated directive cannot be a DO without control.
  do
     a = 3.14
     c = c - 1
     !ERROR: EXIT to construct outside of PARALLEL DO construct is not allowed
     !ERROR: EXIT statement terminates associated loop of an OpenMP DO construct
     if (c < 1) exit
  enddo

! Loop association check

  ! If an end do directive follows a do-construct in which several DO
  ! statements share a DO termination statement, then a do directive
  ! can only be specified for the outermost of these DO statements.
  do 100 i=1, N
     !$omp do
     do 100 j=1, N
        a = 3.14
100     continue
    !$omp enddo

  !ERROR: Non-THREADPRIVATE object 'a' in COPYIN clause
  !$omp parallel do copyin(a)
  do i = 1, N
     !$omp parallel do
     do j = 1, i
     enddo
     !$omp end parallel do
     a = 3.
  enddo
  !$omp end parallel do

  !$omp parallel do
  do i = 1, N
  enddo
  !$omp end parallel do

  !$omp parallel
  a = 3.0
  !$omp do simd
  do i = 1, N
  enddo
  !$omp end do simd

  !ERROR: Non-THREADPRIVATE object 'a' in COPYIN clause
  !$omp parallel do copyin(a)
  do i = 1, N
  enddo
  !$omp end parallel

  a = 0.0
  !$omp parallel do private(c)
  do i = 1, N
     do j = 1, N
        !ERROR: OpenMP loop construct should contain a DO-loop or a loop-nest-generating OpenMP construct
        !$omp parallel do shared(b)
        a = 3.14
     enddo
  enddo
  a = 1.414

  do i = 1, N
     !$omp parallel do
     do j = 2*i*N, (2*i+1)*N
        a = 3.14
     enddo
  enddo

  !ERROR: OpenMP loop construct should contain a DO-loop or a loop-nest-generating OpenMP construct
  !$omp parallel do private(c)
5 FORMAT (1PE12.4, I10)
  do i=1, N
     a = 3.14
  enddo

  !$omp parallel do simd
  do i = 1, N
     a = 3.14
  enddo
  !$omp end parallel do simd

  !ERROR: OpenMP loop construct should contain a DO-loop or a loop-nest-generating OpenMP construct
  !$omp simd
  !$omp end simd
   a = i + 1
end