!RUN: %flang_fc1 -fdebug-unparse -fopenmp %s | FileCheck --ignore-case --check-prefix="UNPARSE" %s !RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp %s | FileCheck --check-prefix="PARSE-TREE" %s ! Check that this is parsed correctly. Specifically, that the "10 continue" ! terminates both do-loops, and both "parallel do" directives. subroutine f !$omp parallel do lastprivate(i) do 10 i=1,2 !$omp parallel do lastprivate(j) do 10 j=1,2 10 continue !$omp parallel !$omp end parallel print *,'pass' end !UNPARSE: SUBROUTINE f !UNPARSE: !$OMP PARALLEL DO LASTPRIVATE(i) !UNPARSE: DO i=1_4,2_4 !UNPARSE: !$OMP PARALLEL DO LASTPRIVATE(j) !UNPARSE: DO j=1_4,2_4 !UNPARSE: 10 CONTINUE !UNPARSE: END DO !UNPARSE: END DO !UNPARSE: !$OMP PARALLEL !UNPARSE: !$OMP END PARALLEL !UNPARSE: PRINT *, "pass" !UNPARSE: END SUBROUTINE !PARSE-TREE: Program -> ProgramUnit -> SubroutineSubprogram !PARSE-TREE: | SubroutineStmt !PARSE-TREE: | | Name = 'f' !PARSE-TREE: | SpecificationPart !PARSE-TREE: | | ImplicitPart -> !PARSE-TREE: | ExecutionPart -> Block !PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE: | | | OmpBeginDirective !PARSE-TREE: | | | | OmpDirectiveName -> llvm::omp::Directive = parallel do !PARSE-TREE: | | | | OmpClauseList -> OmpClause -> Lastprivate -> OmpLastprivateClause !PARSE-TREE: | | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'i' !PARSE-TREE: | | | | Flags = {} !PARSE-TREE: | | | Block !PARSE-TREE: | | | | ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct !PARSE-TREE: | | | | | NonLabelDoStmt !PARSE-TREE: | | | | | | LoopControl -> LoopBounds !PARSE-TREE: | | | | | | | Scalar -> Name = 'i' !PARSE-TREE: | | | | | | | Scalar -> Expr = '1_4' !PARSE-TREE: | | | | | | | | LiteralConstant -> IntLiteralConstant = '1' !PARSE-TREE: | | | | | | | Scalar -> Expr = '2_4' !PARSE-TREE: | | | | | | | | LiteralConstant -> IntLiteralConstant = '2' !PARSE-TREE: | | | | | Block !PARSE-TREE: | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct !PARSE-TREE: | | | | | | | OmpBeginDirective !PARSE-TREE: | | | | | | | | OmpDirectiveName -> llvm::omp::Directive = parallel do !PARSE-TREE: | | | | | | | | OmpClauseList -> OmpClause -> Lastprivate -> OmpLastprivateClause !PARSE-TREE: | | | | | | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'j' !PARSE-TREE: | | | | | | | | Flags = {CrossesLabelDo} !PARSE-TREE: | | | | | | | Block !PARSE-TREE: | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct !PARSE-TREE: | | | | | | | | | NonLabelDoStmt !PARSE-TREE: | | | | | | | | | | LoopControl -> LoopBounds !PARSE-TREE: | | | | | | | | | | | Scalar -> Name = 'j' !PARSE-TREE: | | | | | | | | | | | Scalar -> Expr = '1_4' !PARSE-TREE: | | | | | | | | | | | | LiteralConstant -> IntLiteralConstant = '1' !PARSE-TREE: | | | | | | | | | | | Scalar -> Expr = '2_4' !PARSE-TREE: | | | | | | | | | | | | LiteralConstant -> IntLiteralConstant = '2' !PARSE-TREE: | | | | | | | | | Block !PARSE-TREE: | | | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> ContinueStmt !PARSE-TREE: | | | | | | | | | EndDoStmt -> !PARSE-TREE: | | | | | EndDoStmt -> !PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct !PARSE-TREE: | | | OmpBeginDirective !PARSE-TREE: | | | | OmpDirectiveName -> llvm::omp::Directive = parallel !PARSE-TREE: | | | | OmpClauseList -> !PARSE-TREE: | | | | Flags = {} !PARSE-TREE: | | | Block !PARSE-TREE: | | | OmpEndDirective !PARSE-TREE: | | | | OmpDirectiveName -> llvm::omp::Directive = parallel !PARSE-TREE: | | | | OmpClauseList -> !PARSE-TREE: | | | | Flags = {} !PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> PrintStmt !PARSE-TREE: | | | Format -> Star !PARSE-TREE: | | | OutputItem -> Expr = '"pass"' !PARSE-TREE: | | | | LiteralConstant -> CharLiteralConstant !PARSE-TREE: | | | | | string = 'pass' !PARSE-TREE: | EndSubroutineStmt ->