! RUN: %python %S/test_errors.py %s %flang_fc1 -fopenmp
! OpenMP Version 4.5
! Various checks with the nesting of MASTER construct

program omp_nest_master
  integer i, k, j
  k = 0;

  !$omp do
  do i = 1, 10
    k = k + 1
    !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
    !$omp master
    j = j -1
    !$omp end master
  end do

  !$omp sections 
  !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
    !$omp master
    do i = 1, 10
      k = k + 1
    end do
    !$omp end master
  !$omp end sections

  !$omp single 
  !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
    !$omp master
    do i = 1, 10
      k = k + 1
    end do
    !$omp end master
  !$omp end single



  !$omp task
  do i = 1, 10
    k = k + 1
    !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
    !$omp master
    j = j -1
    !$omp end master
  end do
  !$omp end task

  !$omp taskloop
  do i = 1, 10
    k = k + 1
    !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
    !$omp master
    j = j -1
    !$omp end master
  end do
  !$omp end taskloop

  !$omp target parallel do simd
  do i = 1, 10
    k = k + 1
    !ERROR: The only OpenMP constructs that can be encountered during execution of a 'SIMD' region are the `ATOMIC` construct, the `LOOP` construct, the `SIMD` construct and the `ORDERED` construct with the `SIMD` clause.
    !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
    !$omp master
    j = j -1
    !$omp end master
  end do
  !$omp end target parallel do simd

  !$omp critical
  do i = 1, 10
    k = k + 1
    !$omp master
    j = j -1
    !$omp end master
  end do
  !$omp end critical

  !$omp ordered
  do i = 1, 10
    k = k + 1
    !$omp master
    j = j -1
    !$omp end master
  end do
  !$omp end ordered

  !$omp ordered
  do i = 1, 10
    !ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
    !$omp teams
    !$omp distribute
    do k =1, 10
      print *, "hello"
      !$omp master
      j = j -1
      !$omp end master
    end do
    !$omp end distribute
    !$omp end teams
  end do
  !$omp end ordered

  !$omp critical
  do i = 1, 10
    !ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
    !$omp teams
    !$omp distribute
    do k =1, 10
      print *, "hello"
      !$omp master
      j = j -1
      !$omp end master
    end do
    !$omp end distribute
    !$omp end teams
  end do
  !$omp end critical

  !$omp taskloop
  do i = 1, 10
    !ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
    !$omp teams
    !$omp distribute
    do k =1, 10
      print *, "hello"
      !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
      !$omp master
      j = j -1
      !$omp end master
    end do
    !$omp end distribute
    !$omp end teams
  end do
  !$omp end taskloop

  !$omp task
  do i = 1, 10
    !ERROR: TEAMS region can only be strictly nested within the implicit parallel region or TARGET region
    !$omp teams
    !$omp distribute
    do k =1, 10
      print *, "hello"
      !ERROR: `MASTER` region may not be closely nested inside of `WORKSHARING`, `LOOP`, `TASK`, `TASKLOOP`, or `ATOMIC` region.
      !$omp master
      j = j -1
      !$omp end master
    end do
    !$omp end distribute
    !$omp end teams
  end do
  !$omp end task

end program omp_nest_master
