| ! { dg-do run } |
| |
| integer :: a, b, c |
| a = 1 |
| b = 2 |
| c = 3 |
| call foo |
| if (a .ne. 7) call abort |
| contains |
| subroutine foo |
| use omp_lib |
| logical :: l |
| l = .false. |
| !$omp parallel shared (a) private (b) firstprivate (c) & |
| !$omp num_threads (2) reduction (.or.:l) |
| if (a .ne. 1 .or. c .ne. 3) l = .true. |
| !$omp barrier |
| if (omp_get_thread_num () .eq. 0) then |
| a = 4 |
| b = 5 |
| c = 6 |
| end if |
| !$omp barrier |
| if (omp_get_thread_num () .eq. 1) then |
| if (a .ne. 4 .or. c .ne. 3) l = .true. |
| a = 7 |
| b = 8 |
| c = 9 |
| else if (omp_get_num_threads () .eq. 1) then |
| a = 7 |
| end if |
| !$omp barrier |
| if (omp_get_thread_num () .eq. 0) then |
| if (a .ne. 7 .or. b .ne. 5 .or. c .ne. 6) l = .true. |
| end if |
| !$omp barrier |
| if (omp_get_thread_num () .eq. 1) then |
| if (a .ne. 7 .or. b .ne. 8 .or. c .ne. 9) l = .true. |
| end if |
| !$omp end parallel |
| if (l) call abort |
| end subroutine foo |
| end |