| ! 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 | |
| subroutine openmp_sections(x, y) | |
| integer, intent(inout)::x, y | |
| !============================================================================== | |
| ! empty construct | |
| !============================================================================== | |
| !CHECK: !$omp sections | |
| !$omp sections | |
| !CHECK: !$omp end sections | |
| !$omp end sections | |
| !PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPSectionsConstruct | |
| !PARSE-TREE: | OmpBeginSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | OmpEndSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !============================================================================== | |
| ! single section, without `!$omp section` | |
| !============================================================================== | |
| !CHECK: !$omp sections | |
| !$omp sections | |
| !CHECK: CALL | |
| call F1() | |
| !CHECK: !$omp end sections | |
| !$omp end sections | |
| !PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPSectionsConstruct | |
| !PARSE-TREE: | OmpBeginSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f1()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f1' | |
| !PARSE-TREE: | OmpEndSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !============================================================================== | |
| ! single section with `!$omp section` | |
| !============================================================================== | |
| !CHECK: !$omp sections | |
| !$omp sections | |
| !CHECK: !$omp section | |
| !$omp section | |
| !CHECK: CALL F1 | |
| call F1 | |
| !CHECK: !$omp end sections | |
| !$omp end sections | |
| !PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPSectionsConstruct | |
| !PARSE-TREE: | OmpBeginSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | OmpDirectiveSpecification | |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = section | |
| !PARSE-TREE: | | | OmpClauseList -> | |
| !PARSE-TREE: | | | Flags = {} | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f1()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f1' | |
| !PARSE-TREE: | OmpEndSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !============================================================================== | |
| ! multiple sections | |
| !============================================================================== | |
| !CHECK: !$omp sections | |
| !$omp sections | |
| !CHECK: !$omp section | |
| !$omp section | |
| !CHECK: CALL F1 | |
| call F1 | |
| !CHECK: !$omp section | |
| !$omp section | |
| !CHECK: CALL F2 | |
| call F2 | |
| !CHECK: !$omp section | |
| !$omp section | |
| !CHECK: CALL F3 | |
| call F3 | |
| !CHECK: !$omp end sections | |
| !$omp end sections | |
| !PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPSectionsConstruct | |
| !PARSE-TREE: | OmpBeginSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | OmpDirectiveSpecification | |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = section | |
| !PARSE-TREE: | | | OmpClauseList -> | |
| !PARSE-TREE: | | | Flags = {} | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f1()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f1' | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | OmpDirectiveSpecification | |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = section | |
| !PARSE-TREE: | | | OmpClauseList -> | |
| !PARSE-TREE: | | | Flags = {} | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f2()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f2' | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | OmpDirectiveSpecification | |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = section | |
| !PARSE-TREE: | | | OmpClauseList -> | |
| !PARSE-TREE: | | | Flags = {} | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f3()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f3' | |
| !PARSE-TREE: | OmpEndSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> | |
| !PARSE-TREE: | | Flags = {} | |
| !============================================================================== | |
| ! multiple sections with clauses | |
| !============================================================================== | |
| !CHECK: !$omp sections PRIVATE(x) FIRSTPRIVATE(y) | |
| !$omp sections PRIVATE(x) FIRSTPRIVATE(y) | |
| !CHECK: !$omp section | |
| !$omp section | |
| !CHECK: CALL F1 | |
| call F1 | |
| !CHECK: !$omp section | |
| !$omp section | |
| !CHECK: CALL F2 | |
| call F2 | |
| !CHECK: !$omp section | |
| !$omp section | |
| !CHECK: CALL F3 | |
| call F3 | |
| !CHECK: !$omp end sections NOWAIT | |
| !$omp end sections NOWAIT | |
| !PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPSectionsConstruct | |
| !PARSE-TREE: | OmpBeginSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> OmpClause -> Private -> OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x' | |
| !PARSE-TREE: | | OmpClause -> Firstprivate -> OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'y' | |
| !PARSE-TREE: | | Flags = {} | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | OmpDirectiveSpecification | |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = section | |
| !PARSE-TREE: | | | OmpClauseList -> | |
| !PARSE-TREE: | | | Flags = {} | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f1()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f1' | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | OmpDirectiveSpecification | |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = section | |
| !PARSE-TREE: | | | OmpClauseList -> | |
| !PARSE-TREE: | | | Flags = {} | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f2()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f2' | |
| !PARSE-TREE: | OpenMPConstruct -> OmpSectionDirective | |
| !PARSE-TREE: | | OmpDirectiveSpecification | |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = section | |
| !PARSE-TREE: | | | OmpClauseList -> | |
| !PARSE-TREE: | | | Flags = {} | |
| !PARSE-TREE: | | Block | |
| !PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL f3()' | |
| !PARSE-TREE: | | | | Call | |
| !PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'f3' | |
| !PARSE-TREE: | OmpEndSectionsDirective | |
| !PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = sections | |
| !PARSE-TREE: | | OmpClauseList -> OmpClause -> Nowait | |
| !PARSE-TREE: | | Flags = {} | |
| END subroutine openmp_sections |