! RUN: %flang_fc1 -fdebug-unparse -fopenmp %s | FileCheck --ignore-case %s ! RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp %s | FileCheck --check-prefix="PARSE-TREE" %s ! Check for ORDER([order-modifier :]concurrent) clause on OpenMP constructs subroutine test_do_order() integer :: i, j = 1 !CHECK: !$omp do order(concurrent) !$omp do order(concurrent) do i=1,10 j = j + 1 end do !$omp end do end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = do !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Type = Concurrent subroutine test_simd_order_reproducible() integer :: i, j = 1 !CHECK: !$omp simd order(reproducible:concurrent) !$omp simd order(reproducible:concurrent) do i=1,10 j = j + 1 end do !$omp end simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Reproducible !PARSE-TREE-NEXT: Type = Concurrent subroutine test_do_simd_order_unconstrained() integer :: i, j = 1 !CHECK: !$omp do simd order(unconstrained:concurrent) !$omp do simd order(unconstrained:concurrent) do i=1,10 j = j + 1 end do !$omp end do simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = do simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Unconstrained !PARSE-TREE-NEXT: Type = Concurrent subroutine test_parallel_do_order() integer :: i, j = 1 !CHECK: !$omp parallel do order(concurrent) !$omp parallel do order(concurrent) do i=1,10 j = j + 1 end do !$omp end parallel do end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = parallel do !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Type = Concurrent subroutine test_parallel_do_simd_order_reproducible() integer :: i, j = 1 !CHECK: !$omp parallel do simd order(reproducible:concurrent) !$omp parallel do simd order(reproducible:concurrent) do i=1,10 j = j + 1 end do !$omp end parallel do simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = parallel do simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Reproducible !PARSE-TREE-NEXT: Type = Concurrent subroutine test_target_simd_order_unconstrained() integer :: i, j = 1 !CHECK: !$omp target simd order(unconstrained:concurrent) !$omp target simd order(unconstrained:concurrent) do i=1,10 j = j + 1 end do !$omp end target simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = target simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Unconstrained !PARSE-TREE-NEXT: Type = Concurrent subroutine test_target_parallel_do_order() integer :: i, j = 1 !CHECK: !$omp target parallel do order(concurrent) !$omp target parallel do order(concurrent) do i=1,10 j = j + 1 end do !$omp end target parallel do end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = target parallel do !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Type = Concurrent subroutine test_target_parallel_do_simd_order_reproducible() integer :: i, j = 1 !CHECK: !$omp target parallel do simd order(reproducible:concurrent) !$omp target parallel do simd order(reproducible:concurrent) do i=1,10 j = j + 1 end do !$omp end target parallel do simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = target parallel do simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Reproducible !PARSE-TREE-NEXT: Type = Concurrent subroutine test_teams_distribute_simd_order_unconstrained() integer :: i, j = 1 !CHECK: !$omp teams distribute simd order(unconstrained:concurrent) !$omp teams distribute simd order(unconstrained:concurrent) do i=1,10 j = j + 1 end do !$omp end teams distribute simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = teams distribute simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Unconstrained !PARSE-TREE-NEXT: Type = Concurrent subroutine test_teams_distribute_parallel_do_order() integer :: i, j = 1 !CHECK: !$omp teams distribute parallel do order(concurrent) !$omp teams distribute parallel do order(concurrent) do i=1,10 j = j + 1 end do !$omp end teams distribute parallel do end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = teams distribute parallel do !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Type = Concurrent subroutine test_teams_distribute_parallel_do_simd_order_reproducible() integer :: i, j = 1 !CHECK: !$omp teams distribute parallel do simd order(reproducible:concurrent) !$omp teams distribute parallel do simd order(reproducible:concurrent) do i=1,10 j = j + 1 end do !$omp end teams distribute parallel do simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = teams distribute parallel do simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Reproducible !PARSE-TREE-NEXT: Type = Concurrent subroutine test_target_teams_distribute_simd_order_unconstrained() integer :: i, j = 1 !CHECK: !$omp target teams distribute simd order(unconstrained:concurrent) !$omp target teams distribute simd order(unconstrained:concurrent) do i=1,10 j = j + 1 end do !$omp end target teams distribute simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = target teams distribute simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Unconstrained !PARSE-TREE-NEXT: Type = Concurrent subroutine test_target_teams_distribute_parallel_do_order() integer :: i, j = 1 !CHECK: !$omp target teams distribute parallel do order(concurrent) !$omp target teams distribute parallel do order(concurrent) do i=1,10 j = j + 1 end do !$omp end target teams distribute parallel do end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = target teams distribute parallel do !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Type = Concurrent subroutine test_target_teams_distribute_parallel_do_simd_order_reproducible() integer :: i, j = 1 !CHECK: !$omp target teams distribute parallel do simd order(reproducible:concurrent) !$omp target teams distribute parallel do simd order(reproducible:concurrent) do i=1,10 j = j + 1 end do !$omp end target teams distribute parallel do simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = target teams distribute parallel do simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Reproducible !PARSE-TREE-NEXT: Type = Concurrent subroutine test_taskloop_simd_order_unconstrained() integer :: i, j = 1 !CHECK: !$omp taskloop simd order(unconstrained:concurrent) !$omp taskloop simd order(unconstrained:concurrent) do i=1,10 j = j + 1 end do !$omp end taskloop simd end subroutine !PARSE-TREE: OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE-NEXT: OmpBeginLoopDirective !PARSE-TREE-NEXT: OmpLoopDirective -> llvm::omp::Directive = taskloop simd !PARSE-TREE-NEXT: OmpClauseList -> OmpClause -> Order -> OmpOrderClause !PARSE-TREE-NEXT: Kind = Unconstrained !PARSE-TREE-NEXT: Type = Concurrent