llvm-project/flang/test/Parser/OpenMP/block-construct.f90
Krzysztof Parzyszek 88b71e2048
[flang][OpenMP] Replace OpenMPBlockConstruct with OmpBlockConstruct (#155872)
OpenMPBlockConstruct, somewhat confusingly, represents most but not all
block-associated constructs. It's derived from OmpBlockConstruct, as are
all the remaining block-associated constructs.

It does not correspond to any well-defined group of constructs. It's the
collection of constructs that don't have their own types (and those that
do have their own types do so for their own reasons).

Using the broader OmpBlockConstruct in type-based visitors won't cause
issues, because the specific overloads (for classes derived from it)
will always be preferred.
2025-08-29 07:37:48 -05:00

166 lines
6.3 KiB
Fortran

!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
subroutine f00(x, y)
implicit none
integer :: x, y
!$omp target map(x, y)
x = y + 1
y = 2 * x
!$omp end target
end
!UNPARSE: SUBROUTINE f00 (x, y)
!UNPARSE: IMPLICIT NONE
!UNPARSE: INTEGER x, y
!UNPARSE: !$OMP TARGET MAP(x,y)
!UNPARSE: x=y+1_4
!UNPARSE: y=2_4*x
!UNPARSE: !$OMP END TARGET
!UNPARSE: END SUBROUTINE
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | | OmpClauseList -> OmpClause -> Map -> OmpMapClause
!PARSE-TREE: | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | OmpObject -> Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | bool = 'true'
!PARSE-TREE: | Block
!PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=y+1_4'
!PARSE-TREE: | | | Variable = 'x'
!PARSE-TREE: | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | Expr = 'y+1_4'
!PARSE-TREE: | | | | Add
!PARSE-TREE: | | | | | Expr = 'y'
!PARSE-TREE: | | | | | | Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | | | Expr = '1_4'
!PARSE-TREE: | | | | | | LiteralConstant -> IntLiteralConstant = '1'
!PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'y=2_4*x'
!PARSE-TREE: | | | Variable = 'y'
!PARSE-TREE: | | | | Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | Expr = '2_4*x'
!PARSE-TREE: | | | | Multiply
!PARSE-TREE: | | | | | Expr = '2_4'
!PARSE-TREE: | | | | | | LiteralConstant -> IntLiteralConstant = '2'
!PARSE-TREE: | | | | | Expr = 'x'
!PARSE-TREE: | | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | OmpEndDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | | OmpClauseList ->
subroutine f01(x, y)
implicit none
integer :: x, y
!$omp target map(x, y)
block
x = y + 1
y = 2 * x
endblock
! No end-directive
end
!UNPARSE: SUBROUTINE f01 (x, y)
!UNPARSE: IMPLICIT NONE
!UNPARSE: INTEGER x, y
!UNPARSE: !$OMP TARGET MAP(x,y)
!UNPARSE: BLOCK
!UNPARSE: x=y+1_4
!UNPARSE: y=2_4*x
!UNPARSE: END BLOCK
!UNPARSE: END SUBROUTINE
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | | OmpClauseList -> OmpClause -> Map -> OmpMapClause
!PARSE-TREE: | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | OmpObject -> Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | bool = 'true'
!PARSE-TREE: | Block
!PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> BlockConstruct
!PARSE-TREE: | | | BlockStmt ->
!PARSE-TREE: | | | BlockSpecificationPart -> SpecificationPart
!PARSE-TREE: | | | | ImplicitPart ->
!PARSE-TREE: | | | Block
!PARSE-TREE: | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=y+1_4'
!PARSE-TREE: | | | | | Variable = 'x'
!PARSE-TREE: | | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | | | Expr = 'y+1_4'
!PARSE-TREE: | | | | | | Add
!PARSE-TREE: | | | | | | | Expr = 'y'
!PARSE-TREE: | | | | | | | | Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | | | | | Expr = '1_4'
!PARSE-TREE: | | | | | | | | LiteralConstant -> IntLiteralConstant = '1'
!PARSE-TREE: | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'y=2_4*x'
!PARSE-TREE: | | | | | Variable = 'y'
!PARSE-TREE: | | | | | | Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | | | Expr = '2_4*x'
!PARSE-TREE: | | | | | | Multiply
!PARSE-TREE: | | | | | | | Expr = '2_4'
!PARSE-TREE: | | | | | | | | LiteralConstant -> IntLiteralConstant = '2'
!PARSE-TREE: | | | | | | | Expr = 'x'
!PARSE-TREE: | | | | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | EndBlockStmt ->
subroutine f02(x, y)
implicit none
integer :: x, y
!$omp target map(x, y)
block
x = y + 1
y = 2 * x
endblock
! End-directive present
!$omp end target
end
!UNPARSE: SUBROUTINE f02 (x, y)
!UNPARSE: IMPLICIT NONE
!UNPARSE: INTEGER x, y
!UNPARSE: !$OMP TARGET MAP(x,y)
!UNPARSE: BLOCK
!UNPARSE: x=y+1_4
!UNPARSE: y=2_4*x
!UNPARSE: END BLOCK
!UNPARSE: !$OMP END TARGET
!UNPARSE: END SUBROUTINE
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OmpBlockConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | | OmpClauseList -> OmpClause -> Map -> OmpMapClause
!PARSE-TREE: | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | OmpObject -> Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | bool = 'true'
!PARSE-TREE: | Block
!PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> BlockConstruct
!PARSE-TREE: | | | BlockStmt ->
!PARSE-TREE: | | | BlockSpecificationPart -> SpecificationPart
!PARSE-TREE: | | | | ImplicitPart ->
!PARSE-TREE: | | | Block
!PARSE-TREE: | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=y+1_4'
!PARSE-TREE: | | | | | Variable = 'x'
!PARSE-TREE: | | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | | | Expr = 'y+1_4'
!PARSE-TREE: | | | | | | Add
!PARSE-TREE: | | | | | | | Expr = 'y'
!PARSE-TREE: | | | | | | | | Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | | | | | Expr = '1_4'
!PARSE-TREE: | | | | | | | | LiteralConstant -> IntLiteralConstant = '1'
!PARSE-TREE: | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'y=2_4*x'
!PARSE-TREE: | | | | | Variable = 'y'
!PARSE-TREE: | | | | | | Designator -> DataRef -> Name = 'y'
!PARSE-TREE: | | | | | Expr = '2_4*x'
!PARSE-TREE: | | | | | | Multiply
!PARSE-TREE: | | | | | | | Expr = '2_4'
!PARSE-TREE: | | | | | | | | LiteralConstant -> IntLiteralConstant = '2'
!PARSE-TREE: | | | | | | | Expr = 'x'
!PARSE-TREE: | | | | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | EndBlockStmt ->
!PARSE-TREE: | OmpEndDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = target
!PARSE-TREE: | | OmpClauseList ->