Files
clang-p2996/flang/test/Parser/OpenMP/nothing.f90
Krzysztof Parzyszek adeff9f63a [flang][OpenMP] Allow utility constructs in specification part (#121509)
Allow utility constructs (error and nothing) to appear in the
specification part as well as the execution part. The exception is
"ERROR AT(EXECUTION)" which should only be in the execution part.
In case of ambiguity (the boundary between the specification and the
execution part), utility constructs will be parsed as belonging to the
specification part. In such cases move them to the execution part in the
OpenMP canonicalization code.
2025-01-03 09:21:36 -06:00

113 lines
3.8 KiB
Fortran

!RUN: %flang_fc1 -fdebug-unparse -fopenmp -fopenmp-version=51 %s | FileCheck --ignore-case --check-prefix="UNPARSE" %s
!RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp -fopenmp-version=51 %s | FileCheck --check-prefix="PARSE-TREE" %s
subroutine f00
!$omp nothing
end
!UNPARSE: SUBROUTINE f00
!UNPARSE: !$OMP NOTHING
!UNPARSE: END SUBROUTINE
!PARSE-TREE: ExecutionPart -> Block
!PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPUtilityConstruct -> OmpNothingDirective
subroutine f01
block
import, none
integer :: x
!$omp nothing ! "nothing" in the execution part
x = x+1
end block
end
!UNPARSE: SUBROUTINE f01
!UNPARSE: BLOCK
!UNPARSE: IMPORT, NONE
!UNPARSE: INTEGER x
!UNPARSE: !$OMP NOTHING
!UNPARSE: x=x+1_4
!UNPARSE: END BLOCK
!UNPARSE: END SUBROUTINE
!PARSE-TREE: BlockStmt ->
!PARSE-TREE: BlockSpecificationPart -> SpecificationPart
!PARSE-TREE: | ImportStmt
!PARSE-TREE: | ImplicitPart ->
!PARSE-TREE: | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt
!PARSE-TREE: | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
!PARSE-TREE: | | EntityDecl
!PARSE-TREE: | | | Name = 'x'
!PARSE-TREE: Block
!PARSE-TREE: | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPUtilityConstruct -> OmpNothingDirective
!PARSE-TREE: | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=x+1_4'
!PARSE-TREE: | | Variable = 'x'
!PARSE-TREE: | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | Expr = 'x+1_4'
!PARSE-TREE: | | | Add
!PARSE-TREE: | | | | Expr = 'x'
!PARSE-TREE: | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | | Expr = '1_4'
!PARSE-TREE: | | | | | LiteralConstant -> IntLiteralConstant = '1'
!PARSE-TREE: EndBlockStmt ->
subroutine f02
integer :: x
!$omp nothing
end
!UNPARSE: SUBROUTINE f02
!UNPARSE: INTEGER x
!UNPARSE: !$OMP NOTHING
!UNPARSE: END SUBROUTINE
!PARSE-TREE: SpecificationPart
!PARSE-TREE: | ImplicitPart ->
!PARSE-TREE: | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt
!PARSE-TREE: | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
!PARSE-TREE: | | EntityDecl
!PARSE-TREE: | | | Name = 'x'
!PARSE-TREE: ExecutionPart -> Block
!PARSE-TREE: | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPUtilityConstruct -> OmpNothingDirective
subroutine f03
block
!$omp nothing ! "nothing" in the specification part
import, none
integer :: x
x = x+1
end block
end
!UNPARSE: SUBROUTINE f03
!UNPARSE: BLOCK
!UNPARSE: !$OMP NOTHING
!UNPARSE: IMPORT, NONE
!UNPARSE: INTEGER x
!UNPARSE: x=x+1_4
!UNPARSE: END BLOCK
!UNPARSE: END SUBROUTINE
!PARSE-TREE: ExecutionPart -> Block
!PARSE-TREE: | ExecutionPartConstruct -> ExecutableConstruct -> BlockConstruct
!PARSE-TREE: | | BlockStmt ->
!PARSE-TREE: | | BlockSpecificationPart -> SpecificationPart
!PARSE-TREE: | | | OpenMPDeclarativeConstruct -> OpenMPUtilityConstruct -> OmpNothingDirective
!PARSE-TREE: | | | ImportStmt
!PARSE-TREE: | | | ImplicitPart ->
!PARSE-TREE: | | | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt
!PARSE-TREE: | | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec ->
!PARSE-TREE: | | | | EntityDecl
!PARSE-TREE: | | | | | Name = 'x'
!PARSE-TREE: | | Block
!PARSE-TREE: | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'x=x+1_4'
!PARSE-TREE: | | | | Variable = 'x'
!PARSE-TREE: | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | | Expr = 'x+1_4'
!PARSE-TREE: | | | | | Add
!PARSE-TREE: | | | | | | Expr = 'x'
!PARSE-TREE: | | | | | | | Designator -> DataRef -> Name = 'x'
!PARSE-TREE: | | | | | | Expr = '1_4'
!PARSE-TREE: | | | | | | | LiteralConstant -> IntLiteralConstant = '1'
!PARSE-TREE: | | EndBlockStmt ->
!PARSE-TREE: EndSubroutineStmt ->