1! { dg-do run }
2        REAL FUNCTION WORK1(I)
3            INTEGER I
4            WORK1 = 1.0 * I
5            RETURN
6        END FUNCTION WORK1
7
8        REAL FUNCTION WORK2(I)
9            INTEGER I
10            WORK2 = 2.0 * I
11            RETURN
12        END FUNCTION WORK2
13
14        SUBROUTINE SUBA16(X, Y, INDEX, N)
15        REAL X(*), Y(*)
16        INTEGER INDEX(*), N
17        INTEGER I
18!$OMP PARALLEL DO SHARED(X, Y, INDEX, N)
19          DO I=1,N
20!$OMP ATOMIC
21              X(INDEX(I)) = X(INDEX(I)) + WORK1(I)
22            Y(I) = Y(I) + WORK2(I)
23          ENDDO
24      END SUBROUTINE SUBA16
25
26      PROGRAM A16
27        REAL X(1000), Y(10000)
28        INTEGER INDEX(10000)
29        INTEGER I
30        DO I=1,10000
31          INDEX(I) = MOD(I, 1000) + 1
32          Y(I) = 0.0
33        ENDDO
34        DO I = 1,1000
35          X(I) = 0.0
36        ENDDO
37        CALL SUBA16(X, Y, INDEX, 10000)
38        DO I = 1,10
39          PRINT *, "X(", I, ") = ", X(I), ", Y(", I, ") = ", Y(I)
40        ENDDO
41      END PROGRAM A16
42