summaryrefslogtreecommitdiff
path: root/libgomp/testsuite/libgomp.fortran/appendix-a/a.19.1.f90
blob: 1fe1c4247268649bd4b63a6f628e4a5a40d5ab3d (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
! { dg-do run }
        SUBROUTINE F1(Q)
        COMMON /DATA/ P, X
        INTEGER, TARGET :: X
        INTEGER, POINTER :: P
        INTEGER Q
        Q=1
!$OMP FLUSH
        ! X, P and Q are flushed
        ! because they are shared and accessible
      END SUBROUTINE F1
      SUBROUTINE F2(Q)
        COMMON /DATA/ P, X
        INTEGER, TARGET :: X
        INTEGER, POINTER :: P
        INTEGER Q
!$OMP BARRIER
          Q=2
!$OMP BARRIER
          ! a barrier implies a flush
          ! X, P and Q are flushed
          ! because they are shared and accessible
        END SUBROUTINE F2

      INTEGER FUNCTION G(N)
          COMMON /DATA/ P, X
          INTEGER, TARGET :: X
          INTEGER, POINTER :: P
          INTEGER N
          INTEGER I, J, SUM
          I=1
          SUM = 0
          P=1
!$OMP PARALLEL REDUCTION(+: SUM) NUM_THREADS(2)
          CALL F1(J)
                ! I, N and SUM were not flushed
                !   because they were not accessible in F1
                ! J was flushed because it was accessible
          SUM = SUM + J
          CALL F2(J)
                ! I, N, and SUM were not flushed
                ! because they were not accessible in f2
                ! J was flushed because it was accessible
          SUM = SUM + I + J + P + N
!$OMP END PARALLEL
          G = SUM
      END FUNCTION G

      PROGRAM A19
        COMMON /DATA/ P, X
        INTEGER, TARGET :: X
        INTEGER, POINTER :: P
        INTEGER RESULT, G
        P => X
        RESULT = G(10)
        PRINT *, RESULT
        IF (RESULT .NE. 30) THEN
          CALL ABORT
        ENDIF
      END PROGRAM A19