1! { dg-do compile }
2! { dg-options "-ffixed-form" }
3        MODULE DATA
4        USE OMP_LIB, ONLY: OMP_NEST_LOCK_KIND
5        TYPE LOCKED_PAIR
6        INTEGER A
7        INTEGER B
8        INTEGER (OMP_NEST_LOCK_KIND) LCK
9        END TYPE
10            END MODULE DATA
11        SUBROUTINE INCR_A(P, A)
12            ! called only from INCR_PAIR, no need to lock
13            USE DATA
14            TYPE(LOCKED_PAIR) :: P
15            INTEGER A
16            P%A = P%A + A
17        END SUBROUTINE INCR_A
18        SUBROUTINE INCR_B(P, B)
19            ! called from both INCR_PAIR and elsewhere,
20            ! so we need a nestable lock
21            USE OMP_LIB       ! or INCLUDE "omp_lib.h"
22            USE DATA
23            TYPE(LOCKED_PAIR) :: P
24            INTEGER B
25            CALL OMP_SET_NEST_LOCK(P%LCK)
26            P%B = P%B + B
27            CALL OMP_UNSET_NEST_LOCK(P%LCK)
28        END SUBROUTINE INCR_B
29        SUBROUTINE INCR_PAIR(P, A, B)
30            USE OMP_LIB         ! or INCLUDE "omp_lib.h"
31            USE DATA
32            TYPE(LOCKED_PAIR) :: P
33            INTEGER A
34            INTEGER B
35        CALL OMP_SET_NEST_LOCK(P%LCK)
36        CALL INCR_A(P, A)
37        CALL INCR_B(P, B)
38        CALL OMP_UNSET_NEST_LOCK(P%LCK)
39      END SUBROUTINE INCR_PAIR
40      SUBROUTINE A40(P)
41        USE OMP_LIB        ! or INCLUDE "omp_lib.h"
42        USE DATA
43        TYPE(LOCKED_PAIR) :: P
44        INTEGER WORK1, WORK2, WORK3
45        EXTERNAL WORK1, WORK2, WORK3
46!$OMP PARALLEL SECTIONS
47!$OMP SECTION
48          CALL INCR_PAIR(P, WORK1(), WORK2())
49!$OMP SECTION
50          CALL INCR_B(P, WORK3())
51!$OMP END PARALLEL SECTIONS
52      END SUBROUTINE A40
53
54! { dg-final { cleanup-modules "data" } }
55