INTENT

Statement and Attribute: Specifies the intended use of one or more dummy arguments.

Syntax

The INTENT attribute can be specified in a type declaration statement or an INTENT statement, and takes one of the following forms:

Type Declaration Statement:

type,[att-ls,] INTENT (intent-spec) [, att-ls] :: d-arg[, d-arg]...

Statement:

INTENT (intent-spec) [::] d-arg[, d-arg] ...

type

Is a data type specifier.

att-ls

Is an optional list of attribute specifiers.

intent-spec

Is one of the following specifiers:

IN

Specifies that the dummy argument will be used only to provide data to the procedure. The dummy argument must not be redefined (or become undefined) during execution of the procedure.

OUT

Specifies that the dummy argument will be used to pass data from the procedure back to the calling program. The dummy argument is undefined on entry and must be defined before it is referenced in the procedure.

Any associated actual argument must be definable.

INOUT

Specifies that the dummy argument can both provide data to the procedure and return data to the calling program.

Any associated actual argument must be definable.

d-arg

Is the name of a dummy argument or dummy pointer. It cannot be a dummy procedure.

Description

The INTENT statement can only appear in the specification part of a subprogram or interface body.

If no INTENT attribute is specified for a dummy argument, its use is subject to the limitations of the associated actual argument.

If a function specifies a defined operator, the dummy arguments must have intent IN.

If a subroutine specifies defined assignment, the first argument must have intent OUT or INOUT, and the second argument must have intent IN.

A non-pointer dummy argument with intent IN (or a subobject of such a dummy argument) must not appear as any of the following:

INTENT on a pointer dummy argument refers to the pointer association status of the pointer and has no effect on the value of the target of the pointer.

A pointer dummy argument with intent IN (or a subobject of such a pointer argument) must not appear as any of the following:

If an actual argument is an array section with a vector subscript, it cannot be associated with a dummy array that is defined or redefined (has intent OUT or INOUT).

Example

The following example shows type declaration statements specifying the INTENT attribute:

SUBROUTINE TEST(I, J)

INTEGER, INTENT(IN) :: I

INTEGER, INTENT(OUT), DIMENSION(I) :: J

The following are examples of the INTENT statement:

SUBROUTINE TEST(A, B, X)

INTENT(INOUT) :: A, B

...

SUBROUTINE CHANGE(FROM, TO)

USE EMPLOYEE_MODULE

TYPE(EMPLOYEE) FROM, TO

INTENT(IN) FROM

INTENT(OUT) TO

...

The following shows another example:

SUBROUTINE AVERAGE(value,data1, cube_ave)

TYPE DATA

INTEGER count

REAL avg

END TYPE

TYPE(DATA) data1

REAL tmp

! value cannot be changed, while cube_ave must be defined

! before it can be used. Data1 is defined when the procedure is

! invoked, and becomes redefined in the subroutine.

INTENT(IN)::value; INTENT(OUT)::cube_ave

INTENT(INOUT)::data1

! count number of times AVERAGE has been called on the data set

! being passed.

tmp = data1%count*data1%avg + value

data1%count = data1%count + 1

data1%avg = tmp/data1%count

cube_ave = data1%avg**3

END SUBROUTINE

See Also