! Test that the INLINEALWAYS directive can be parsed, both at callsite and within the function ! RUN: %flang_fc1 -fdebug-dump-parse-tree %s 2>&1 | FileCheck %s --check-prefix=PARSE-TREE ! RUN: %flang_fc1 -fdebug-unparse %s 2>&1 | FileCheck %s --check-prefix=UNPARSE subroutine test_subroutine() !DIR$ INLINEALWAYS test_subroutine end subroutine subroutine test_subroutine2() end subroutine integer function test_func() result(res) !DIR$ INLINEALWAYS test_func res = 10 end function integer function test_func2() result(res) res = 10 end function subroutine test() implicit none integer :: i, test_func1, test_func2 call test_subroutine() !DIR$ INLINEALWAYS call test_subroutine2() i = test_func1() !DIR$ INLINEALWAYS i = test_func2() end subroutine ! UNPARSE: SUBROUTINE test_subroutine ! UNPARSE: !DIR$ INLINEALWAYS TEST_SUBROUTINE ! UNPARSE: END SUBROUTINE ! UNPARSE: SUBROUTINE test_subroutine2 ! UNPARSE: END SUBROUTINE ! UNPARSE: INTEGER FUNCTION test_func() RESULT(res) ! UNPARSE: !DIR$ INLINEALWAYS TEST_FUNC ! UNPARSE: res=10_4 ! UNPARSE: END FUNCTION ! UNPARSE: INTEGER FUNCTION test_func2() RESULT(res) ! UNPARSE: res=10_4 ! UNPARSE: END FUNCTION ! UNPARSE: SUBROUTINE test ! UNPARSE: IMPLICIT NONE ! UNPARSE: INTEGER i, test_func1, test_func2 ! UNPARSE: CALL test_subroutine() ! UNPARSE: !DIR$ INLINEALWAYS ! UNPARSE: CALL test_subroutine2() ! UNPARSE: i=test_func1() ! UNPARSE: !DIR$ INLINEALWAYS ! UNPARSE: i=test_func2() ! UNPARSE: END SUBROUTINE ! PARSE-TREE: ======================== Flang: parse tree dump ======================== ! PARSE-TREE: Program -> ProgramUnit -> SubroutineSubprogram ! PARSE-TREE: | SubroutineStmt ! PARSE-TREE: | | Name = 'test_subroutine' ! PARSE-TREE: | SpecificationPart ! PARSE-TREE: | | ImplicitPart -> ! PARSE-TREE: | ExecutionPart -> Block ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> CompilerDirective -> InlineAlways -> Name = 'test_subroutine' ! PARSE-TREE: | EndSubroutineStmt -> ! PARSE-TREE: ProgramUnit -> SubroutineSubprogram ! PARSE-TREE: | SubroutineStmt ! PARSE-TREE: | | Name = 'test_subroutine2' ! PARSE-TREE: | SpecificationPart ! PARSE-TREE: | | ImplicitPart -> ! PARSE-TREE: | ExecutionPart -> Block ! PARSE-TREE: | EndSubroutineStmt -> ! PARSE-TREE: ProgramUnit -> FunctionSubprogram ! PARSE-TREE: | FunctionStmt ! PARSE-TREE: | | PrefixSpec -> DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> ! PARSE-TREE: | | Name = 'test_func' ! PARSE-TREE: | | Suffix ! PARSE-TREE: | | | Name = 'res' ! PARSE-TREE: | SpecificationPart ! PARSE-TREE: | | ImplicitPart -> ! PARSE-TREE: | ExecutionPart -> Block ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> CompilerDirective -> InlineAlways -> Name = 'test_func' ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'res=10_4' ! PARSE-TREE: | | | Variable = 'res' ! PARSE-TREE: | | | | Designator -> DataRef -> Name = 'res' ! PARSE-TREE: | | | Expr = '10_4' ! PARSE-TREE: | | | | LiteralConstant -> IntLiteralConstant = '10' ! PARSE-TREE: | EndFunctionStmt -> ! PARSE-TREE: ProgramUnit -> FunctionSubprogram ! PARSE-TREE: | FunctionStmt ! PARSE-TREE: | | PrefixSpec -> DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> ! PARSE-TREE: | | Name = 'test_func2' ! PARSE-TREE: | | Suffix ! PARSE-TREE: | | | Name = 'res' ! PARSE-TREE: | SpecificationPart ! PARSE-TREE: | | ImplicitPart -> ! PARSE-TREE: | ExecutionPart -> Block ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'res=10_4' ! PARSE-TREE: | | | Variable = 'res' ! PARSE-TREE: | | | | Designator -> DataRef -> Name = 'res' ! PARSE-TREE: | | | Expr = '10_4' ! PARSE-TREE: | | | | LiteralConstant -> IntLiteralConstant = '10' ! PARSE-TREE: | EndFunctionStmt -> ! PARSE-TREE: ProgramUnit -> SubroutineSubprogram ! PARSE-TREE: | SubroutineStmt ! PARSE-TREE: | | Name = 'test' ! PARSE-TREE: | SpecificationPart ! PARSE-TREE: | | ImplicitPart -> ImplicitPartStmt -> ImplicitStmt -> ! PARSE-TREE: | | DeclarationConstruct -> SpecificationConstruct -> TypeDeclarationStmt ! PARSE-TREE: | | | DeclarationTypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> ! PARSE-TREE: | | | EntityDecl ! PARSE-TREE: | | | | Name = 'i' ! PARSE-TREE: | | | EntityDecl ! PARSE-TREE: | | | | Name = 'test_func1' ! PARSE-TREE: | | | EntityDecl ! PARSE-TREE: | | | | Name = 'test_func2' ! PARSE-TREE: | ExecutionPart -> Block ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL test_subroutine()' ! PARSE-TREE: | | | Call ! PARSE-TREE: | | | | ProcedureDesignator -> Name = 'test_subroutine' ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> CompilerDirective -> InlineAlways -> ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> CallStmt = 'CALL test_subroutine2()' ! PARSE-TREE: | | | Call ! PARSE-TREE: | | | | ProcedureDesignator -> Name = 'test_subroutine2' ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'i=test_func1()' ! PARSE-TREE: | | | Variable = 'i' ! PARSE-TREE: | | | | Designator -> DataRef -> Name = 'i' ! PARSE-TREE: | | | Expr = 'test_func1()' ! PARSE-TREE: | | | | FunctionReference -> Call ! PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'test_func1' ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> CompilerDirective -> InlineAlways -> ! PARSE-TREE: | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> AssignmentStmt = 'i=test_func2()' ! PARSE-TREE: | | | Variable = 'i' ! PARSE-TREE: | | | | Designator -> DataRef -> Name = 'i' ! PARSE-TREE: | | | Expr = 'test_func2()' ! PARSE-TREE: | | | | FunctionReference -> Call ! PARSE-TREE: | | | | | ProcedureDesignator -> Name = 'test_func2' ! PARSE-TREE: | EndSubroutineStmt ->